【问题标题】:Detect when only preprocessing, i.e. gcc -E仅检测何时进行预处理,即 gcc -E
【发布时间】:2016-07-24 22:15:16
【问题描述】:

我目前调用 clang 或 gcc

cc -E -DPREPROCESSING ...

在调试宏时。

我发现定义是多余的。我可以在源代码中编写一个表达式来检测编译器在预处理后何时停止,然后从我的构建脚本中删除这个定义吗?

#if magic
#define PREPROCESSING
#ending

查看文档表明没有,但幸运的是我错过了一些东西。

【问题讨论】:

  • 拥有这个不会有非常普遍的价值,并且会引入构建错误。构建系统可以选择将预处理作为一个单独的步骤,多次调用编译器。如果存在此功能,则预处理然后分别编译(例如,以提高跨平台并行构建性能)将生成与在单个执行中进行预处理和编译不同的输出。那将是非常令人惊讶和错误的行为。在这种情况下,您将如何处理预编译的标头?

标签: gcc clang c-preprocessor


【解决方案1】:

您提出的任何解决方案都将是特定于编译器的,因为 C 标准对单独的预处理没有任何规定。

在 gcc 中,您可以通过添加自定义规范文件来实现这一魔法:

%rename cpp old_cpp
*cpp:
%{E:-DPREPROCESSING} %(old_cpp)

你需要告诉 gcc 使用这个规范文件 (-specs=/path/to/specfile),除非你编译你自己的 gcc 并将上述定义添加到内置的 cpp 规范中。如果您使用的是 Makefile,您可以将上面的 -specs 选项添加到您的 CFLAGS

(我应该补充一点,我认为这不是一个特别好的主意。但它是可能的。)

【讨论】:

  • 我不知道规范文件。我希望有一个点修复,你已经提供了一个通用机制。很好,谢谢
猜你喜欢
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
  • 2018-10-06
  • 1970-01-01
  • 2021-02-13
  • 2011-06-16
  • 2017-01-12
相关资源
最近更新 更多