我在名为CFLite.c
的文件中有结构定义,如下所示
typedef struct CFLString CFLString;
struct CFLString
{
CFLObject base;
char * data;
size_t size;
};
此结构在CFLite.h
typedef struct CFLString * CFLStringRef;
这又是CFCompat.h
中#define-ed的
#include "CFLite.h"
#define CFStringRef CFLStringRef
现在,在本地函数中,我有一个简单的打印语句,其中包含标题CFCompat.h
,其中我尝试打印成员变量data
指向的字符串。
MyClass::PrintFunc(){
CFLStringRef inVal;
printf("--- str = %s ",inVal->data) //<--- Compiler error here :
`data` cannot be unresolved.
}
答案 0 :(得分:3)
根据您的说明,struct CFLString
的定义位于源文件CFLite.c
中,而不是其他地方。这意味着在该文件之外的任何地方,类型struct CFLString
都是不完整的,因此其成员是未知的。
如果要访问结构的成员,其定义必须可用(通常在标题中)。
答案 1 :(得分:1)
要取消引用inVal
- 表达式inVal->data
的作用,编译器需要可见的完整结构定义。
前瞻声明是不够的。
这意味着struct
定义需要位于其中一个头文件中,并且该头文件需要(直接或间接)在所有尝试访问其成员的源文件中#include
d struct
。