如何使用宏在 c 中使用令牌粘贴来连接两个令牌来字符串化?

How to stringize by concatenating two tokens using token-pasting in c using macros?

提问人:thirdeye 提问时间:9/14/2023 更新时间:9/14/2023 访问量:60

问:

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

#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
字符串 c-preprocessor token-pasting-operator

评论

0赞 Joel 9/14/2023
引用 stackoverflow 这两个词怎么样?
0赞 Fe2O3 9/14/2023
printf( "%s\n", "stack" "overflow" );让编译器(而不是预处理器)为您执行串联......

答:

4赞 Chris Dodd 9/14/2023 #1

如果要连接后字符串化,则需要先连接,然后字符串化:

#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;
}

仅向宏添加 a 的问题在于它会尝试在 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;
}

这也避免了在要连接的内容不是单个令牌和/或不成为单个令牌时出现的问题,这两者都会导致未定义的行为。