【问题标题】:C preprocessor: what is the motivation behind not macro-expanding arguments of #error directive?C 预处理器:#error 指令的非宏扩展参数背后的动机是什么?
【发布时间】: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


【解决方案1】:

我并不是说这是标准的动机,但考虑到我对#error 的许多用途,将其宏观扩展会很不方便。
不可否认,我的习惯可能是由不扩张形成的。

#define MINIMUMCONFIG 1
#ifndef IMPORTANTCONFIG
#error  IMPORTANTCONFIG is undefined!
#error
#if     IMPORTANTCONFIG < MINIMUMCONFIG
#error  IMPORTANTCONFIG lower than MINIMUMCONFIG !
#endif

【讨论】:

  • 有趣。谢谢你的例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多