在 C 中使用 ## 运算符连接字符串
Concatenate strings using ## operators in C
在 C 中,我们可以使用 ## 连接参数化宏的两个参数,如下所示:
arg1
## arg2
which returns arg1arg2
我写了这段代码,希望它能连接 return 我是一个字符串文字,但我无法让它工作:
#define catstr(x, y) x##y
puts("catting these strings\t" catstr(lmao, elephant));
return出现以下错误:
define_directives.c:31:39: error: expected ‘)’ before ‘lmaoelephant’
31 | puts("catting these strings\t" catstr(lmao, elephant));
| ^
| )
似乎字符串是串联的,但它们需要用引号括起来以便 puts
打印出来。但是这样做,宏不再起作用。我该如何解决这个问题?
您不需要使用 ##
来连接字符串。 C 已经连接了相邻的字符串:"abc" "def"
将变为 "abcdef"
.
如果你想让lmao
和elephant
变成字符串(出于某种原因不用自己把它们放在引号里),你需要使用stringize运算符,#
:
#define string(x) #x
puts("catting these strings\t" string(lmao) string(elephant));
要以这种方式使用对 puts()
的调用,应构造宏 catstr()
来做两件事:
- 字符串化并将
lmao
连接到字符串 "catting these strings\t"
- 将
elephant
字符串化并连接到 lmao
。
您可以通过更改现有的宏定义来完成此操作:
#define catstr(x, y) x##y
收件人:
#define catstr(x, y) #x#y
这基本上导致:
"catting these strings\t"#lmao#elephant
或:
"catting these strings lmaoelephant"
使它成为一个单一的空终止字符串,并适合作为 puts()
:
的参数
puts("catting these strings\t" catstr(lmao, elephant));
在 C 中,我们可以使用 ## 连接参数化宏的两个参数,如下所示:
arg1
##arg2
which returnsarg1arg2
我写了这段代码,希望它能连接 return 我是一个字符串文字,但我无法让它工作:
#define catstr(x, y) x##y
puts("catting these strings\t" catstr(lmao, elephant));
return出现以下错误:
define_directives.c:31:39: error: expected ‘)’ before ‘lmaoelephant’
31 | puts("catting these strings\t" catstr(lmao, elephant));
| ^
| )
似乎字符串是串联的,但它们需要用引号括起来以便 puts
打印出来。但是这样做,宏不再起作用。我该如何解决这个问题?
您不需要使用 ##
来连接字符串。 C 已经连接了相邻的字符串:"abc" "def"
将变为 "abcdef"
.
如果你想让lmao
和elephant
变成字符串(出于某种原因不用自己把它们放在引号里),你需要使用stringize运算符,#
:
#define string(x) #x
puts("catting these strings\t" string(lmao) string(elephant));
要以这种方式使用对 puts()
的调用,应构造宏 catstr()
来做两件事:
- 字符串化并将
lmao
连接到字符串"catting these strings\t"
- 将
elephant
字符串化并连接到lmao
。
您可以通过更改现有的宏定义来完成此操作:
#define catstr(x, y) x##y
收件人:
#define catstr(x, y) #x#y
这基本上导致:
"catting these strings\t"#lmao#elephant
或:
"catting these strings lmaoelephant"
使它成为一个单一的空终止字符串,并适合作为 puts()
:
puts("catting these strings\t" catstr(lmao, elephant));