【问题标题】:C preprocessor: How can I disable #error macro?C 预处理器:如何禁用#error 宏?
【发布时间】:2016-01-10 03:14:24
【问题描述】:

我正在开发一个 C 语法分析程序。在运行 C 预处理器时,有一些库会检查环境并使用 #error 停止编译。我如何禁用它们,因为我只需要完成预处理步骤?

【问题讨论】:

  • 您只想完成预处理步骤?没有标准的方法来抑制#error 的影响。很久以前(甚至可能在上个千年),即使 Solaris 编译器执行 #error; 也会完成。然而,这是 Solaris 编译器中的一个错误——我相信这个错误早已修复。也许你需要看看为什么库(可能是头文件)会生成#error 指令并设置它们以便它们不被执行——这样预处理器就不会遇到错误。
  • 您可以修改文件并注释掉#error 行吗?
  • 如果您忽略#errors,您的分析结果会不会错误? #errors 显然不是由真正的编译过程触发的,因此您的分析器和真正的编译器之间肯定存在差异。

标签: c compiler-errors macros


【解决方案1】:

为什么要禁用它们?他们正在输出错误并出于某种原因停止编译。我知道禁用它们的唯一方法是修改源代码并删除它们。

【讨论】:

  • 不是 OP,而是检查某些编译器版本并在您使用其他编译器时输出错误的 3rd 方库。许多静态分析工具都充当编译器。我不想要这些特定的#errors,我也不想修改第 3 方标头(从那时起您需要在每次更新时重做)。
【解决方案2】:

如果正在执行 #error 预处理器指令,则表示预处理已完成。

如果指令是有条件的(例如,仅在满足某些条件时才发出错误,例如在 #ifdef SOME_MACRO - #endif 块中),那么避免它的方法是确保相关条件不真的。

#error 是无条件的(极其罕见的)情况下,可能意图是立即停止预处理。解决方案不是禁用它,而是避免它(例如,不是 #include 执行此操作的文件)不要禁用它。

如果您只想运行预处理器,那么#error 的存在没有任何区别。大多数编译器要么将预处理器作为单独的程序,要么有一个选项(例如“gcc - E”)导致编译在预处理阶段后停止。

【讨论】:

    猜你喜欢
    • 2020-02-09
    • 2022-01-14
    • 2011-01-26
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    相关资源
    最近更新 更多