想要连接两个标记并仅使用宏和标记粘贴及字符串化操作符将结果转换为字符串。
#include <stdio.h>
#define concat_(s1, s2) s1##s2
#define concat(s1, s2) concat_(s1, s2)
#define firstname stack
#define lastname overflow
int main()
{
printf("%s\n", concat(firstname, lastname));
return 0;
}
但上面抛出未声明的错误如下error: ‘stackoverflow’ undeclared (first use in this function)
我试着用#
来字符串化s1##s2
#define concat_(s1, s2) #s1##s2 \\ error: pasting ""stack"" and "overflow" does not give a valid preprocessing token
1条答案
按热度按时间n6lpvg4x1#
如果你想先连接,然后串化,你需要先连接,然后串化:
只向
concat_
宏添加#
的问题是,它将尝试在concat之前进行字符串化。当然,对于字符串,实际上不需要用预处理器将它们连接起来-编译器会自动将两个字符串文字组合成一个,它们之间除了空白之外没有任何东西:
这也避免了如果你想要连接的东西不是单个的token和/或没有成为一个token的问题,这两种情况都会导致未定义的行为。