为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
qq_遁去的一_1 2019-10-06 12:58:45
至少某些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”的结果。


查看完整回答
反对 回复 2019-10-06
?
冉冉说

TA贡献1877条经验 获得超1个赞

正如史蒂夫(Steve)所指出的那样,这是有保证的,并且自C89标准以来一直得到保证-该标准是将宏中的##运算符整理成代码的标准,并强制递归扩展args中的宏,然后且仅当且仅当主体不对参数应用##。在这方面,C99与C89相同。


查看完整回答
反对 回复 2019-10-06
  • 2 回答
  • 0 关注
  • 339 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信