展开引用字符串中的宏

dav*_*ide 26 c macros c-strings c-preprocessor

可能重复:
C宏以创建字符串

我有一个函数接受一个类型的参数char*,比如f("string");
如果字符串参数是在函数调用中由-the-fly定义的,那么如何在字符串体内扩展宏呢?

例如:

#define COLOR #00ff00
f("abc COLOR");
Run Code Online (Sandbox Code Playgroud)

相当于

f("abc #00ff00");
Run Code Online (Sandbox Code Playgroud)

但相反,不执行扩展,并且函数从字面上接收abc COLOR.

特别是,我需要精确地扩展宏\"#00ff00\",以便这个引用的标记与传递给它的其余字符串参数连接f(),包括引号; 也就是说,预处理器必须完成他的工作并欢迎编译器将代码转换f("abc COLOR");f("abc \"#00ff00\"");

tom*_*ahh 38

您无法在字符串中展开宏,但您可以编写

#define COLOR "#00ff00"

f("abc "COLOR);
Run Code Online (Sandbox Code Playgroud)

请记住,这种连接是由C预处理器完成的,并且只是连接普通字符串而不是变量的功能.

  • @davide no,将两个字符串文字放在一起使得C编译器将它们连接起来. (6认同)
  • 我认为串联"abc""#00ff00"`到"abc#00ff00"是由编译器而不是预处理器执行的.https://gcc.gnu.org/onlinedocs/cpp/Stringification.html在第二段中注意:`预处理器将用字符串常量替换字符串化的参数.然后,C编译器将所有相邻的字符串常量组合成一个长字符串 (6认同)
  • 不,字符串将由编译器连接.在编译时,字符串将导致"abc#00ff00" (3认同)