我应该根据一个头文件和一些进一步的描述来制作一个程序。需要处理不透明类型的问题。不透明结构是在头文件中声明的,还有其他一些函数。但是每个函数都应该有自己的.c文件,这就是问题所在。我应该做什么,或者应该在哪里定义不透明的结构,这样我的函数就可以使用它了?
我有这样的文件:
header.h .h source.c e.c(Main)功能1.c功能2.c等。
在这种情况下,我不知道该怎么做。
发布于 2019-04-16 13:42:10
您的全局头文件应该在没有实现的情况下定义类型名称,以及创建、销毁和处理该类型数据的原型函数。
header.h
#ifndef HEADER_H_
#define HEADER_H_
struct XyzData;
typedef struct XyzData XYZDATA;
typedef struct XyzData *P_XYZDATA;
P_XYZDATA CreateEmptyXyzData();
P_XYZDATA CreateFilledXyzData(int param1, int param2);
void DestroyXyzData(P_XYZDATA pData);
int ModifyXyzData(P_XYZDATA pData, int action, int param);
#endif然后您需要一个内部标头,它为结构提供了一个实现。
xyzintheader.h
#ifndef XYZINTHEADER_H_
#define XYZINTHEADER_H_
#include "header.h" // include the XyzData declaration
struct XyzData { // and add its definition
int par1;
int par2;
};
#endif然后,具有特定例程实现的文件将使用内部标头,因为它们需要知道访问它们的结构细节。
xyzcreate.c
#include "xyzintheader.h"
#include <stdlib.h>
P_XYZDATA CreateEmptyXyzData() {
return calloc(1, sizeof(XYZDATA));
};xyzcreatf.c
#include "xyzintheader.h"
#include <stdlib.h>
P_XYZDATA CreateFilledXyzData(int param1, int param2) {
if (P_XYZDATA pData = malloc(sizeof(XYZDATA))) {
pData->par1 = param1;
pData->par2 = param2;
return pData;
}
return NULL;
};xyzdestr.c
#include "xyzintheader.h"
#include <stdlib.h>
void DestroyXyzData(P_XYZDATA pData) {
free(pData);
}xyzmodif.c
#include "xyzintheader.h"
int ModifyXyzData(P_XYZDATA pData, int action, int param) {
if (! pData)
return -1;
switch (action) {
case 0:
// do something
pData->par1 = pData->par2 = 0;
return 0;
case 1:
// do something
pData->par1 += param;
pData->par2 -= param;
return 0;
}
return -2;
}外部模块将使用公共标头,因为它们只需要知道存在的结构以及处理它的工具。
source.c
#include "header.h"
void SomeExternalLogic()
{
if (P_XYZDATA pData = CreateEmptyXyzData()) {
ModifyXyzData(pData, 0, 0);
ModifyXyzData(pData, 1, 3);
if (ModifyXyzData(pData, 13, 17) < 0)
WriteSomeErrorMessage();
DestroyXyzData(pData);
}
}发布于 2019-04-16 12:53:08
我将创建一个私有(内部)头文件,与包含结构定义的公共header.h文件分开。
为了保持一致性,它可能应该包括公共标题。类似于:
#ifndef INTERNAL_HEADER_H_
#define INTERNAL_HEADER_H_
#include "header.h" // contains 'struct foo;'
struct foo {
int data; // or whatever
};
#endif然后,您的每个.c文件都可以包含internal_header.h并访问结构成员。
https://stackoverflow.com/questions/55708456
复制相似问题