2

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

我在一个标头中声明了一个 typedef 结构:

Firstheader.h

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

然后我想在另一个头文件的函数声明中使用这个 typedef 的结构:

Secondheader.h

#include "Firstheader.h"

void foo (const PinStruct *myPin);

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

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

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

4

3 回答 3

0

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

void foo(const PinStruct *);
于 2013-08-13T22:17:10.160 回答
0

您的代码应该可以正常工作(使用GCC和进行测试CLANG)。

  1. 您正在定义您的结构typedef并将其别名为PinStruct- 没有错误。
  2. 您包含第一个头文件——没有错误。
  3. PinStruct在函数声明中使用foo-- 没有错误。

错误可能在你的 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?
于 2013-08-13T20:45:46.740 回答
0

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

您可以通过PinStruct在 SecondHeader.h 中声明来解决它,使用所谓的前向声明:

typedef struct Pin PinStruct;
于 2013-08-14T19:13:16.817 回答