Pet*_*sey 81 c stringification c-preprocessor
至少有一些C预处理器允许你将宏的值(而不是它的名称)通过一个类似函数的宏传递给另一个将它串行化的宏来进行字符串化:
#define STR1(x) #x
#define STR2(x) STR1(x)
#define THE_ANSWER 42
#define THE_ANSWER_STR STR2(THE_ANSWER) /* "42" */
Run Code Online (Sandbox Code Playgroud)
这里的用例示例.
这确实有效,至少在GCC和Clang(两者都有-std=c99),但我不确定它是如何工作的C标准术语.
这种行为是否由C99保证?
如果是这样,C99如何保证呢?
如果不是,那么从C定义到GCC定义的行为在什么时候?
Ste*_*sop 76
是的,这是有保证的.
它的工作原理是因为宏的参数本身是宏扩展的,除非宏参数名称出现在带有stringifier#或token-paster ##的宏体中.
6.10.3.1/1:
...在识别出类似函数宏的调用参数之后,进行参数替换.替换列表中的参数,除非前面带有#或##预处理标记或后跟##预处理标记(见下文),在其中包含的所有宏都已扩展后,将被相应的参数替换...
所以,如果你这样做,STR1(THE_ANSWER)你会得到"THE_ANSWER",因为STR1的参数不是宏扩展的.但是,STR2的参数在被替换为STR2的定义时会进行宏扩展,因此STR2的参数42为"42".
Chr*_*odd 19
史蒂夫指出,这是保守的,并且自C89标准以来一直保证 - 这是宏的编码#和##运算符的标准,并且在将它们替换为体内之前递归地扩展args中的宏,当且仅当正文不会在参数中应用#或##.在这方面,C99与C89相同.
| 归档时间: |
|
| 查看次数: |
16791 次 |
| 最近记录: |