【问题标题】:typedef'd struct not found by header标头未找到 typedef 的结构
【发布时间】:2013-08-13 20:36:59
【问题描述】:

我敢肯定这很愚蠢,但我很难过:

我在一个标头中声明了一个 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 未定义”。有人请打我一巴掌,告诉我我错过了什么。

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

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

【问题讨论】:

  • 应该可以正常编译。您需要构造一个 minimal test-case,以及 exact 错误消息。
  • 这应该可以吗?它是在标题中抱怨还是在其他一些代码中抱怨?
  • 小心粘贴您收到的准确错误消息??您最好还确保您认为包含的标题实际上是这样。 #error#pragma message 都是很好的临时测试方法。
  • 我想这可能有你的答案stackoverflow.com/questions/5343916/…
  • Firstheader.h 的最后几行是什么?有时,当#include 行之后的行报告错误时,实际错误来自包含的头文件的末尾。

标签: c struct


【解决方案1】:

您的代码应该可以正常工作(使用GCCCLANG 测试)。

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

错误可能在你的 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?

【讨论】:

    【解决方案2】:

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

    void foo(const PinStruct *);
    

    【讨论】:

      【解决方案3】:

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

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

      typedef struct Pin PinStruct;
      

      【讨论】:

        猜你喜欢
        • 2022-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-28
        相关资源
        最近更新 更多