提问人:thirdeye 提问时间:9/14/2023 更新时间:9/14/2023 访问量:60
如何使用宏在 c 中使用令牌粘贴来连接两个令牌来字符串化?
How to stringize by concatenating two tokens using token-pasting in c using macros?
问:
想要连接两个标记,并仅使用宏以及标记粘贴和字符串化运算符将结果转换为字符串。
#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
答:
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;
}
这也避免了在要连接的内容不是单个令牌和/或不成为单个令牌时出现的问题,这两者都会导致未定义的行为。
下一个:C 预处理器宏中的正则表达式
评论
printf( "%s\n", "stack" "overflow" );
让编译器(而不是预处理器)为您执行串联......