我可以在 C 的预处理器连接中使用“(”吗?

Can I use "(" in preprocessor concatenation in C?

以下在 GCC 中给出了这个错误:粘贴“func_x”和“(”没有提供有效的预处理标记

#include <stdio.h>
#define LOG_FUNC(fname) printf( #fname " %d\n", fname ## ())

int func_x(){
  return 0;
}

int main(){
  LOG_FUNC(func_x);
  return 0;
}

但是,当我将鼠标悬停在函数顶部时,它显示宏扩展为以下表达式,可以正常工作

printf("func_x" " %d\n", func_x())

是否是因为预处理字符串连接中不允许使用括号?

如果您想让代码编译,请将 LOG_FUNC 更改为:

#define LOG_FUNC(fname) printf( #fname " %d\n", fname())

如果要将两个字符串连接在一起,只需将它们并排书写,并用空格分隔即可。如果它们包含括号就可以了。您不必为此使用预处理器,但您可以:

#include <stdio.h>

#define MY_STR(f) f "(\n"

int main() {
  puts(MY_STR("hi")); // outputs "hi("
  return 0;
}