确切地说,双字符串技巧是如何工作的?

至少某些C预处理程序可让您将宏的值(而不是其名称)通过一个类似于函数的宏传递给另一个对其进行字符串化的宏:


#define STR1(x) #x

#define STR2(x) STR1(x)

#define THE_ANSWER 42

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

这里的示例用例。


这确实有效,至少在GCC和Clang(都与中-std=c99)中都有效,但是我不确定它在C标准术语下如何工作。


C99是否可以保证这种行为?

如果是这样,C99如何保证?

如果不是,行为在什么时候从C定义变为GCC定义?


qq_遁去的一_1
浏览 348回答 2
2回答

BIG阳

是的,有保证。之所以可以使用它,是因为宏的参数本身是宏扩展的,除非宏参数名称出现在宏主体中且带有字符串标识符#或令牌标记##。6.10.3.1/1:...确定了调用类似函数的宏的参数后,将进行参数替换。替换列表中的参数,除非在#或##预处理令牌之前或在##预处理令牌之后(请参见下文),否则在扩展其中包含的所有宏之后,将用相应的参数替换...因此,如果这样做,STR1(THE_ANSWER)则会得到“ THE_ANSWER”,因为STR1的参数未进行宏扩展。然而,STR2的参数是当它代入STR2的定义中,其因此给出STR1的参数宏扩展42,与“42”的结果。

冉冉说

正如史蒂夫(Steve)所指出的那样,这是有保证的,并且自C89标准以来一直得到保证-该标准是将宏中的#和##运算符整理成代码的标准,并强制递归扩展args中的宏,然后且仅当且仅当主体不对参数应用#或##。在这方面,C99与C89相同。
打开App,查看更多内容
随时随地看视频慕课网APP