【问题标题】:help with header files in C帮助 C 中的头文件
【发布时间】:2011-01-24 14:03:27
【问题描述】:

好的,我非常了解如何在 C 程序中使用头文件,但是我一直遇到这个问题,我似乎无法解决。情况如下:

Device.c 包含#include "Device.h"

Device.h 包含一个结构的定义和以下...

#ifndef DEVICE_H
#define DEVICE_H
#include "SubDevice.h"
typedef struct {
    subDevice * subDevice1;
    subDevice * subDevice2;
} device;
#endif

SubDevice.c 包含#include SubDevice.h

SubDevice.h 包含 subDevice 结构体的定义以及以下...

#ifndef SUBDEVICE_H
#define SUBDEVICE_H
#include "Device.h"
typedef struct{
    int MyInt;
    double MyDouble;
}subDevice;
#endif

问题是我在结构定义中的 Device.h 中遇到编译器错误。在subDevice * subDevice1; 行上写着syntax error before subDevice

问题是我在每个文件中都包含另一个文件的头文件吗?我认为#ifndef - #define 语句可以防止导致问题...

【问题讨论】:

  • 我不认为#include DEVICE_H 是正确的。
  • SubDevice.h 中的结构真的有名字吗?
  • 哎呀,我在帖子中错过了这一点。我编辑了它。
  • 这仍然是错误的 - 将:#include DEVICE_H 更改为 #include "Device.h" 或您在实际标题中需要的任何内容。
  • @Jordan S:你确定分号也出现在你的实际来源中吗?

标签: c header struct


【解决方案1】:

这不是标题问题。您在SubDevice.h 中的一个typedef 存在问题。所以,做改变:

typedef struct{
    int MyInt;
    double MyDouble;
}

收件人:

typedef struct{
    int MyInt;
    double MyDouble;
} subDevice;

你的问题应该已经解决了。

【讨论】:

  • 改变了它。那是我在我的程序中实际拥有的。
  • #include DEVICE_H 中的SubDevice.h 是什么?
【解决方案2】:

您必须在struct 的声明后放置一个分号,而您的typedef 缺少第二个参数。


EDIT 反映 OP 的编辑

您包括DEVICE_H,这是一个宏。

你需要包含"device.h":

#include "device.h"

【讨论】:

    【解决方案3】:

    问题是你有一个循环引用。

    我猜你的主文件看起来像这样:

    #include "Subdevice.h"
    #include "Device.h"
    int main() {}
    

    由于 C 预处理器的工作方式(以及您如何使用包含保护),Device.h 的内容将在 Subdevice.h 之前读取,这意味着当您定义 subDevice 结构体时尚未定义device 结构体。

    Subdevice.h 中删除#include "Device.h",它应该可以编译。

    【讨论】:

      【解决方案4】:

      您的 subdevice.h 中有“typedef struct {...}”,而您应该有“typedef struct {...} subDevice;”

      “#include DEVICE_H”行看起来也有些错误。您是说#include "device.h" 吗?

      【讨论】:

        【解决方案5】:

        您似乎缺少对 C(和 C++)编译器使用的编译模型的充分理解。
        编译 C 或 C++ 源文件可以分为三个阶段:

        1. 预处理
        2. 编译
        3. 链接

        预处理

        在预处理期间,编译器(或单独的预处理器)会检查源文件并执行宏扩展和#include 替换。
        所有#include 指令都替换为引用文件的内容。 处理所有宏定义,并且在文本中出现宏调用的地方,将其替换为替换文本。这是一个完全文本化的过程。

        预处理后,源代码中没有预处理指令(以# 开头的行)

        编译

        在编译过程中,编译器根据C(或C++)语言的规则解释源代码,并将代码翻译成目标代码。

        链接

        在链接阶段,所有目标文件组合在一起并与相关库链接以创建可执行文件。


        这里给出的源代码有两个问题:

        1. subdevice.h 文件包含虚假的#include DEVICE_H 指令。这应该由预处理器/编译器报告,因为DEVICE_H 不会解析为引号或尖括号中的文件名。
        2. 在 subdevice.h 中 typedef 的末尾缺少一个分号 (;)(和一个缺少的 typedef 名称)。结果,编译器试图将它与它看到的下一行代码(device.h 中的typedef struct)结合起来,并变得非常混乱。这会触发语法错误消息。

        【讨论】:

          【解决方案6】:

          调试带有预处理器错误的代码的一种好方法是gcc -E <files>,这样您就可以实际看到在预处理器完成后您的程序会是什么样子。

          【讨论】:

            猜你喜欢
            • 2011-08-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-11
            • 1970-01-01
            • 2017-03-10
            • 1970-01-01
            相关资源
            最近更新 更多