C 头文件原型中的未知类型名称
我有lexer.c文件,它应该包含在另一个.c文件中。它有C 头文件原型中的未知类型名称,c,typedef,header-files,function-prototypes,C,Typedef,Header Files,Function Prototypes,我有lexer.c文件,它应该包含在另一个.c文件中。它有 int getToken(字符串*属性){} 函数和lexer.h头文件中的相同原型。我还有一个helper str.c文件,用于简化字符串处理。它具有声明类型为字符串的头文件: typedef struct { char* str; //string with \0 at the end int length; //length of the string int allocated; //
int getToken(字符串*属性){}
函数和lexer.h头文件中的相同原型。我还有一个helper str.c文件,用于简化字符串处理。它具有声明类型为字符串的头文件:
typedef struct {
char* str; //string with \0 at the end
int length; //length of the string
int allocated; //allocated memory size
} string;
所以,lexer.h包含在主文件中。然后lexer.c以以下内容开头:
#include "str.h"
#include "lexer.h"
据我所知,在包含str.h type之后,对于lexer.c和lexer.h,string是可见的。
但我在头文件中的原型处有编译错误:
./lexer.h:65:14: error: unknown type name 'string'
int getToken(string *attribute);
^
1 error generated.
如何在头文件中使用此类型?我现在不清楚哪些文件包括哪些文件。让我试着重述一下:
包括lexer.c
和str.h
lexer.h
包括main.c
lexer.h
main.c
无法编译,因为实际上,string
类型的定义缺失
由于
lexer.h
总是要求包含str.h
,因此最好将包含在这个头文件中。检查您的typedef是否被排除在外或其他原因。。。与您的问题无关,但是我有lexer.c文件,它应该包含在另一个.c文件中。
--如果不是这样的类型。。。。不要将一个.c包含到另一个中。有时它可能工作正常,但作为一种模式,遵循它最终会导致问题。为什么不简单一点,将自定义声明放在一个公共头文件中,并将其包含在必需的.c文件中。@mah很抱歉我的写作风格,我的意思是通过lexer.h头文件包含到另一个.c文件中是的,没错!谢谢你的帮助,包括str.h到main.c解决了我的问题。标题中不包含“str.h”的作品file@MarkBirger这当然有效。但如果所有头文件都是“自包含的”,即。E工作时不需要包含所需的内容。哦。。我明白,如果我将所有“依赖项”都包含到.h文件中,我不需要将str.h包含到每个文件中。是的。至少,前提是所有.h
文件都支持多次包含,例如。G使用include-guard保护,或者简单到只包含可能重复的语句。