gpt4 book ai didi

c - double-stringize 技巧究竟是如何工作的?

转载 作者:太空宇宙 更新时间:2023-11-04 00:10:05 27 4
gpt4 key购买 nike

至少一些 C 预处理器允许您将宏的值而不是它的名称字符串化,方法是将宏通过一个类似函数的宏传递给另一个将其字符串化的宏:

#define STR1(x) #x
#define STR2(x) STR1(x)
#define THE_ANSWER 42
#define THE_ANSWER_STR STR2(THE_ANSWER) /* "42" */

用例示例 here .

这确实有效,至少在 GCC 和 Clang 中(均使用 -std=c99),但我不确定如何它在 C 标准术语中的工作.

C99 是否保证这种行为?
如果是,C99如何保证?
如果不是,行为在什么时候从 C 定义变为 GCC 定义?

最佳答案

是的,这是有保证的。

之所以有效,是因为宏的参数本身是宏扩展的,除了宏参数名称出现在带有字符串符 # 或标记粘贴符 ## 的宏主体中。

6.10.3.1/1:

... After the arguments for the invocation of a function-like macro have been identified, argument substitution takes place. A parameter in the replacement list, unless preceded by a # or ## preprocessing token or followed by a ## preprocessing token (see below), is replaced by the corresponding argument after all macros contained therein have been expanded...

因此,如果您执行 STR1(THE_ANSWER),那么您将得到“THE_ANSWER”,因为 STR1 的参数未进行宏扩展。然而,当 STR2 的参数被替换到 STR2 的定义中时,宏扩展,因此为 STR1 提供了 42 的参数,结果为“42”。

关于c - double-stringize 技巧究竟是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3961522/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com