【发布时间】:2021-02-12 11:44:07
【问题描述】:
#error(和#warning)指令没有宏观扩展参数背后的动机/理由是什么?
gcc documentation 明确声明:
“#error”和“#warning”都没有宏扩展它的参数。
附:对于#warning(未标准化),解决方法是使用#pragma message (https://stackoverflow.com/a/12638158/1778275),它(通常)宏扩展其参数。
UPD。问题不在于为什么 gcc 不执行宏扩展。 gcc 文档中的引用用作文本示例,其中明确指出 neither #error nor #warning macro-expands its argument。我在 C 标准中找不到这个(或类似的)文本。因此,请参考 gcc 文档中的相当。
UPD2。与#error 相比,#include 对其参数进行宏扩展。引用标准(ISO/IEC 9899:202x (E)):
指令中include 之后的预处理标记与普通文本一样被处理。 (当前定义为宏名称的每个标识符都被替换为其预处理标记的替换列表。)
【问题讨论】:
-
既然是 GCC 文档,
#error的动机当然是它符合 C 标准,该标准在 C 2018 6.10.5 中指定。大概你想知道为什么 C 标准没有为这些标记指定任何扩展。 -
我不确定这背后是否有很多理由。很多源自 C89 的东西只是一时兴起被添加到语言中的。就像,谁能猜到在写
#if FOO != BAR #error FOO is not BAR之类的东西时,我可能也有兴趣知道 FOO 和 BAR 的值... -
C 标准不排除错误信息没有展开内容以及,它只是要求产生一个没有展开内容的信息。
-
至于
#warning,其基本原理是如果您将#error更改为#warning,它的行为不会改变,只是输出格式略有不同的消息并且不会终止编译。#warning在标准中不是。
标签: c macros language-lawyer c-preprocessor