c - 是否有一种标准方法可以在编译时检查该文件是否仅被预处理?
问题描述
__MY_CC__
上下文:不支持除此之外的所有编译器。但是,如何只允许使用第 3 方编译器进行预处理?
#if cc -E
/* permit only preprocessing with a 3rd-party compiler */
#elif ! __MY_CC__
#error unsupported compiler
#endif
UPD。我试图解决的根本问题:
考虑名为
t0.c
.要求
t0.c
:一个。
t0.c
允许仅使用编译器进行my_cc
编译。不支持其他编译器(因为t0.c
包含特定于目标的代码)。湾。
t0.c
还包含一些元信息。元信息在t0.c
预处理后可用。C。元信息将在没有
my_cc
编译器的环境中使用。(这意味着它t0.c
不仅被设计为编译,而且只是被预处理,即不执行后续翻译阶段。)因此,t0.c
需要允许使用任何符合要求的实现(以下称为cc
)进行预处理,即不是my_cc
。如何满足这样的要求?
用户 Paul Hankin 提出了以下方法:
#if ! __MY_CC__
"compiler not supported"
#endif
这段代码:
- 将与
my_cc
. 好的。 cc
由于语法错误(例如为 clang 给出),将不会与 一起编译:
t0.c:4:1: error: expected identifier or '('
"compiler not supported"
^
1 error generated.
好的。
使用生成的翻译单元进行预处理后,
cc -E
将包含"compiler not supported"
,这是不可取的,因为:一个。预计翻译单元不包含任何额外的开销(例如字符串)。
湾。它打破了要求:
cc -E
支持。
不好。
我们可以将 更改"compiler not supported"
为"compilation using non __MY_CC__ is not supported"
。但是,预计在t0.c
预先拥有之后,生成的翻译单元不包含任何额外的开销(例如字符串)。有没有无开销的解决方案?
解决方案
没有标准的方法来请求“仅预处理器”编译。事实上,对于“仅预处理器”编译可能会做什么没有标准定义,因为标准 (a) 不要求预处理器是编译器的可分离模块,并且 (b) 在定义预处理器阶段的范围内, 要求预处理阶段后的结果是不带空格的标记序列,这与字符序列不同。
在这种情况下,肯定没有标准的方法来检测给定的编译器是否在做一些非标准的事情,比如制造一个预处理的输出。
如果您实际上并不关心 100% 的可移植性,您可以使用构建脚本最轻松地做到这一点。
推荐阅读
- ios - 将 VStack 的位置保存在 @State 私有变量中
- sql - 如何在 Oracle DB 中使用 max(Date) 和 Distinct。我想在一天内最后插入数据
- oracle - 插入内部触发器不触发
- javascript - 使用 moment js 将分钟转换为天、小时和分钟
- html - 向右移动 gif 图像
- reactjs - 出现错误:反应中未定义函数
- php - Illuminate\Database\QueryException SQLSTATE[23000]:完整性约束违规:1048 列“f_name”不能为空
- python - 无法更新谷歌电子表格 api 中的对齐方式,未知名称“字段”,python,如何修复?
- c# - 我正在使用 WinForms C#,我想创建一个事件,在按住鼠标时执行我的命令,而不是重复点击
- wpf - 材料设计 wpf 图标按钮不停靠在右侧