至少某些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定义?
2 回答
BIG阳
TA贡献1859条经验 获得超6个赞
是的,有保证。
之所以可以使用它,是因为宏的参数本身是宏扩展的,除非宏参数名称出现在宏主体中且带有字符串标识符#或令牌标记##。
6.10.3.1/1:
...确定了调用类似函数的宏的参数后,将进行参数替换。替换列表中的参数,除非在#或##预处理令牌之前或在##预处理令牌之后(请参见下文),否则在扩展其中包含的所有宏之后,将用相应的参数替换...
因此,如果这样做,STR1(THE_ANSWER)则会得到“ THE_ANSWER”,因为STR1的参数未进行宏扩展。然而,STR2的参数是当它代入STR2的定义中,其因此给出STR1的参数宏扩展42,与“42”的结果。
冉冉说
TA贡献1877条经验 获得超1个赞
正如史蒂夫(Steve)所指出的那样,这是有保证的,并且自C89标准以来一直得到保证-该标准是将宏中的#和##运算符整理成代码的标准,并强制递归扩展args中的宏,然后且仅当且仅当主体不对参数应用#或##。在这方面,C99与C89相同。
- 2 回答
- 0 关注
- 339 浏览
添加回答
举报
0/150
提交
取消