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; //

我有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;  //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保护,或者简单到只包含可能重复的语句。