C预处理器:错误指令的not宏扩展参数背后的动机是什么?

C预处理器:错误指令的not宏扩展参数背后的动机是什么?,c,macros,language-lawyer,c-preprocessor,C,Macros,Language Lawyer,C Preprocessor,#error(和#warning)指令的非宏扩展参数背后的动机/原理是什么 《公约》明确规定: “#error”和“#warning”宏都不会扩展其参数 另外,对于#warning(未标准化),修复方法是使用#pragma message(),该宏(通常)扩展其参数 UPD。问题并不在于gcc为什么不执行宏扩展。引用自gcc文档的内容作为文本示例,其中明确指出无论是#error还是#warning宏都不会扩展其参数。我在C标准中找不到这个(或类似的)文本。因此,请参阅gcc文档中的内容 UPD2

#error
(和
#warning
)指令的非宏扩展参数背后的动机/原理是什么

《公约》明确规定:

“#error”和“#warning”宏都不会扩展其参数

另外,对于
#warning
(未标准化),修复方法是使用
#pragma message
(),该宏(通常)扩展其参数

UPD。问题并不在于gcc为什么不执行宏扩展。引用自
gcc
文档的内容作为文本示例,其中明确指出
无论是#error还是#warning宏都不会扩展其参数
。我在C标准中找不到这个(或类似的)文本。因此,请参阅
gcc
文档中的内容

UPD2。与
#error
相比,
#include
执行其参数的宏表达式。引用标准(ISO/IEC 9899:202x(E)):

指令中包含后的预处理标记的处理方式与普通文本中的处理方式相同。(当前定义为宏名称的每个标识符都由其预处理标记的替换列表替换。)


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

#define MINIMUMCONFIG 1
#ifndef IMPORTANTCONFIG
#error  IMPORTANTCONFIG is undefined!
#error
#if     IMPORTANTCONFIG < MINIMUMCONFIG
#error  IMPORTANTCONFIG lower than MINIMUMCONFIG !
#endif
#定义最小配置1
#ifndef重要配置
#错误重要配置未定义!
#错误
#如果重要配置<最小配置
#错误重要配置低于最小配置!
#恩迪夫

因为这是GCC文档,所以产生
#error
的动机当然是它符合C标准,C标准在C 2018 6.10.5中对此进行了规定。大概你想知道为什么C标准没有为这些令牌指定任何扩展。我不确定这些扩展背后是否有很多理由。许多源于C89的东西只是一时兴起添加到语言中。比如说,在写
#if FOO!=BAR#error FOO不是BAR
,我可能还想知道FOO和BAR的值……C标准并不排除错误消息没有扩展内容,它只要求生成没有扩展内容的消息。至于
#warning
,其基本原理是,如果将
#error
更改为
#warning
,则其行为不会改变,只会输出格式稍有不同的消息,而不会终止编译<代码>#警告不在标准中。有趣。谢谢你的例子。