sho*_*osh 9

不,你做不到.
pound(#)符号在定义中具有不同的含义.这意味着 - 如果这是一个参数,请通过引用它使其成为一个字符串.

  • 事实上,断言宏是使用#stringification运算符.#expr创建assert(expr)参数的C字符串. (3认同)

小智 8

您不能嵌套C预处理程序指令.幸运的是,几乎没有必要.如果你确实需要这种能力,那么在将代码交给C编译器之前,你运行的另一个预处理器几乎肯定会更好.例如:

sed 's/@CUSTOMER@/J. Random Person/' foo.c.in > foo.c
cc foo.c
Run Code Online (Sandbox Code Playgroud)

另一个有用的技巧是将技巧分离为单个头文件,该文件由您自己编写的程序生成:

./generate-trickery --greet 'J. Random Person' > foo.h
Run Code Online (Sandbox Code Playgroud)

其中foo.h看起来像这样:

#define GREET(x) ("J. Random Person greets you, " #x)
Run Code Online (Sandbox Code Playgroud)

如果你将它与Makefile或其他一些自动化结合在一起,它将是非常无缝的,并不会让你的开发更加困难.