【问题标题】:Locate root cause of preprocessor errors - gcc [closed]找到预处理器错误的根本原因 - gcc [关闭]
【发布时间】:2021-01-16 21:10:17
【问题描述】:

我正在尝试逐步构建一个大项目。我正在使用Linux 并使用qt-creatorgcc 编译器。我在.pri 文件中包含一组相关文件,然后构建、测试功能,然后添加一组新的现有文件等等。

项目编译成功,然后我包含了一个包含一些头文件的文件夹,然后编译时我在libc-header-start.hstring.hcpu-set.htime.h 和许多其他 stdlib 和系统文件中遇到了许多错误。 missing binary operator before token (unknown type name __cpu_maskexpected ';', ',' or ')' before '*' token 等错误。

我认为这些很可能是由预处理器错误引起的,例如,如果我忘记了一个半列左右,对吧?

我的问题是,如何在头文件/源文件中找到所有这些错误开始的确切位置,例如,缺少半列的代码行。

【问题讨论】:

  • 最有可能出现在第一个标题的#include 行之前,会出现所有错误。如果在此之前还有另一个#include,则它在该头文件的末尾附近。
  • 我将从编译单个 .c 文件开始。当第一个失败时,使用-E 获取预处理输出,然后检查发生了什么。您甚至可以将整个预处理文件临时复制粘贴到原始 .c 文件上并尝试编译它。
  • 假设“我包含了一个包含一些头文件的文件夹”意味着您在编译选项中添加了-I /some/new/location,那么您可能不应该直接包含新头目录中的文件 -它们的名称与标准标题冲突。查看新目录中的内容。
  • 您还可以使用gcc -E 选项生成预处理文件。然后尝试使用原始命令行选项编译其中一个生成的文件,它应该更容易诊断错误,因为行号将对应于展平的源文件。
  • 谢谢大家。错误列表中的第一个头文件是libc-header-start.h,我的代码中根本没有使用它。也许它包含在其他系统/标准库头文件中。第三个文件是stdint.h,我觉得这很可疑。我将使用gcc -E 并通过包含单个文件进行调查。文件夹中的文件名与标准标题不冲突。

标签: c gcc compiler-errors c-preprocessor


【解决方案1】:

这个答案只是在收集我的问题。

以下是可以帮助定位预处理器错误的根本原因的方法:

  1. 确保头文件的名称与标准头文件不冲突。
  2. 检查错误列表中的第一个文件。检查包含此文件的位置。如果此文件包含在另一个标准头文件中,请检查父头文件包含在代码中的位置。错误的根本原因可能在代码中 #include 语句之前的行中。例如,您可能忘记了#include 之前的半列。
  3. 使用gcc -H file.c检查file.c中包含的所有头文件。
  4. 使用gcc -E file.c 生成file.c 的预处理版本,然后您将获得文件的完整最终图片,然后您可以进行调查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 2017-03-18
    相关资源
    最近更新 更多