标题找不到typedef&#d; d结构

时间:2013-08-13 20:37:00

标签: c struct

我确定这是非常愚蠢的事,但我很难过:

我在一个标题中声明了一个typedef'd结构:

Firstheader.h

typedef struct Pin
{ 
    uint8_t a;
    uint8_t b;
} PinStruct;

然后我想在另一个标题中的函数声明中使用这个typedef'd结构:

Secondheader.h

#include "Firstheader.h"

void foo (const PinStruct *myPin);

尽管在第一个头中明确定义了typedef'd结构,并且在第二个头中包含了第一个头,但编译器仍抱怨“标识符PinStruct未定义”。有人请打我,告诉我我错过了什么。

编辑:感谢评论家伙。编译器将第二个头中的函数声明标记为错误源。确切的错误就像我写的那样:错误[Pe020]:标识符“PinStruct”未定义。

奇怪的是,如果我将结构定义复制到Secondheader.h头文件中,编译器会立即对结构的重新定义进行编译。所以它知道那里。

3 个答案:

答案 0 :(得分:0)

您的代码应该可以正常运行(使用GCCCLANG进行测试)。

  1. 您正在typedef中定义结构,并将其别名化为PinStruct - 没有错误。
  2. 您包含第一个头文件 - 没有错误。
  3. 您在PinStruct的函数声明中使用foo - 没有错误。
  4. 错误可能在您的C源文件中,您是否在“文件2”的C源文件中包含了“文件2”的头文件?例如:

    // File file_1.h
    typedef ...
    

    ......和:

    // File file_2.h
    #include "file_1.h"
    
    // Function declaration.
    

    ...最后(错误在这里):

    // File 2.c
    #include "file_2.h" // Forgot?
    

答案 1 :(得分:0)

语法很好。确保在任何地方都没有语法错误。此外,当您进行原型设计时,您无需在那里声明变量名称。你可以做到

void foo(const PinStruct *);

答案 2 :(得分:0)

你没有提供足够的信息,所以你的问题应该被关闭,但这通常意味着FirstHeader.h在PinStruct被声明之前以某种方式最终包括SecondHeader.h - 即循环依赖。 / p>

您可以使用所谓的前向声明在SecondHeader.h中声明PinStruct来解决此问题:

typedef struct Pin PinStruct;