如何在c中使用宏通过标记粘贴连接两个标记进行字符串化?

70gysomp  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(107)

想要连接两个标记并仅使用宏和标记粘贴及字符串化操作符将结果转换为字符串。

#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
n6lpvg4x

n6lpvg4x1#

如果你想先连接,然后串化,你需要先连接,然后串化:

#include <stdio.h>

#define concat_(s1, s2) s1##s2
#define concat(s1, s2) concat_(s1, s2)
#define string_(s) #s
#define string(s) string_(s)

#define firstname stack
#define lastname overflow

int main()
{
    printf("%s\n", string(concat(firstname, lastname)));
    return 0;
}

只向concat_宏添加#的问题是,它将尝试在concat之前进行字符串化。
当然,对于字符串,实际上不需要用预处理器将它们连接起来-编译器会自动将两个字符串文字组合成一个,它们之间除了空白之外没有任何东西:

#include <stdio.h>

#define string_(s) #s
#define string(s) string_(s)

#define firstname stack
#define lastname overflow

int main()
{
    printf("%s\n", string(firstname) string(lastname));
    return 0;
}

这也避免了如果你想要连接的东西不是单个的token和/或没有成为一个token的问题,这两种情况都会导致未定义的行为。

相关问题