首页 > 解决方案 > 是否有一种标准方法可以在编译时检查该文件是否仅被预处理?

问题描述

__MY_CC__上下文:不支持除此之外的所有编译器。但是,如何只允许使用第 3 方编译器进行预处理?

#if     cc -E
/* permit only preprocessing with a 3rd-party compiler */
#elif   ! __MY_CC__
#error  unsupported compiler
#endif

UPD。我试图解决的根本问题:

  1. 考虑名为t0.c.

  2. 要求t0.c

    一个。t0.c允许仅使用编译器进行my_cc编译。不支持其他编译器(因为t0.c包含特定于目标的代码)。

    湾。t0.c还包含一些元信息。元信息在t0.c预处理后可用。

    C。元信息将在没有my_cc编译器的环境中使用。(这意味着它t0.c不仅被设计为编译,而且只是被预处理,即不执行后续翻译阶段。)因此,t0.c需要允许使用任何符合要求的实现(以下称为cc)进行预处理,即不是my_cc

  3. 如何满足这样的要求?

用户 Paul Hankin 提出了以下方法:

#if   ! __MY_CC__
"compiler not supported"
#endif

这段代码:

  1. 将与my_cc. 好的。
  2. cc由于语法错误(例如为 clang 给出),将不会与 一起编译:
t0.c:4:1: error: expected identifier or '('
"compiler not supported"
^
1 error generated.

好的。

  1. 使用生成的翻译单元进行预处理后,cc -E将包含"compiler not supported",这是不可取的,因为:

    一个。预计翻译单元不包含任何额外的开销(例如字符串)。

    湾。它打破了要求:cc -E 支持

不好。

我们可以将 更改"compiler not supported""compilation using non __MY_CC__ is not supported"。但是,预计在t0.c预先拥有之后,生成的翻译单元不包含任何额外的开销(例如字符串)。有没有无开销的解决方案?

标签: cc-preprocessorc11c17

解决方案


没有标准的方法来请求“仅预处理器”编译。事实上,对于“仅预处理器”编译可能会做什么没有标准定义,因为标准 (a) 不要求预处理器是编译器的可分离模块,并且 (b) 在定义预处理器阶段的范围内, 要求预处理阶段后的结果是不带空格的标记序列,这与字符序列不同。

在这种情况下,肯定没有标准的方法来检测给定的编译器是否在做一些非标准的事情,比如制造一个预处理的输出。

如果您实际上并不关心 100% 的可移植性,您可以使用构建脚本最轻松地做到这一点。


推荐阅读