我正在尝试将
typedef
定义为私有头文件中的结构,并在公共头文件中重新定义它,因为它用作函数的参数,并且只应包含私有头以供使用,如 中所示main.c
示例。我已经在一个更大的项目中看到了这一点,但似乎无法在测试项目中发挥作用。在主源文件中创建类型会导致错误 variable has incomplete type {typeName}
基本示例如下所示
fnc_private.h
#ifndef _FNC_PRIVATE_H_
#define _FNC_PRIVATE_H_
typedef struct fncStruct_t
{
int a;
int b;
} fncStruct_t;
#endif
fnc.h
#ifndef _FNC_H_
#define _FNC_H_
typedef struct fncStruct_t fncStruct_t;
int myFnc(fncStruct_t *h);
#endif
fnc.c
#include "fnc.h"
#include "fnc_private.h"
int myFnc(fncStruct_t *h)
{
return h->a + h->b;
}
main.c
#include <stdio.h>
#include "fnc.h"
int main(void)
{
fncStruct_t h = {3, 4}; // results in 'variable has incomplete type {fncStruct_t}'
printf("sum = %d\n", myFnc(&h));
return 0;
}
如果我在这里做了一些愚蠢的事情,我似乎看不到那是什么。预先感谢。
main.c 看不到
fncStruct_t
的完整定义,只有声明,因此它无法创建该类型的变量。
您可以做的是创建一个指向该类型的指针,然后在 fnc.c 中使用一个函数来动态创建该对象并将其返回给您。
fnc.h
#ifndef _FNC_H_
#define _FNC_H_
typedef struct fncStruct_t fncStruct_t;
fncStruct_t *init(int a, int b);
int myFnc(fncStruct_t *h);
#endif
fnc.c
#include "fnc.h"
#include "fnc_private.h"
int myFnc(fncStruct_t *h)
{
return h->a + h->b;
}
fncStruct_t *init(int a, int b)
{
fncStruct_t *h = malloc(sizeof *h);
h->a = a;
h->b = b;
return h;
}
main.c
#include <stdio.h>
#include "fnc.h"
int main(void)
{
fncStruct_t *h = init(3, 4)
printf("sum = %d\n", myFnc(h));
free(h);
return 0;
}