在 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".

如果你想让lmaoelephant变成字符串(出于某种原因不用自己把它们放在引号里),你需要使用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));