我确定这是非常愚蠢的事,但我很难过:
我在一个标题中声明了一个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
头文件中,编译器会立即对结构的重新定义进行编译。所以它知道那里。
答案 0 :(得分:0)
您的代码应该可以正常运行(使用GCC
和CLANG
进行测试)。
typedef
中定义结构,并将其别名化为PinStruct
- 没有错误。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?
答案 1 :(得分:0)
语法很好。确保在任何地方都没有语法错误。此外,当您进行原型设计时,您无需在那里声明变量名称。你可以做到
void foo(const PinStruct *);
答案 2 :(得分:0)
你没有提供足够的信息,所以你的问题应该被关闭,但这通常意味着FirstHeader.h在PinStruct
被声明之前以某种方式最终包括SecondHeader.h - 即循环依赖。 / p>
您可以使用所谓的前向声明在SecondHeader.h中声明PinStruct
来解决此问题:
typedef struct Pin PinStruct;