在带引号的字符串中展开宏[重复]

Posted

技术标签:

【中文标题】在带引号的字符串中展开宏[重复]【英文标题】:Expand macros inside quoted string [duplicate] 【发布时间】:2012-10-09 03:55:25 【问题描述】:

可能重复:C Macros to create strings

我有一个函数接受char* 类型的一个参数,例如f("string"); 如果字符串参数是在函数调用中动态定义的,如何在字符串体中展开宏?

例如:

#define COLOR #00ff00
f("abc COLOR");

相当于

f("abc #00ff00");

但是不执行扩展,并且函数接收字面上的abc COLOR

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

【问题讨论】:

预处理器不接触字符串文字。 ***.com/questions/798221/c-macros-to-create-strings 【参考方案1】:

不能在字符串中展开宏,但可以写

#define COLOR "#00ff00"

f("abc "COLOR);

请记住,这种连接是由 C 预处理器完成的,它只是连接纯字符串的功能,而不是变量等。

【讨论】:

这是否相当于将 2 个参数传递给 f() ? @davide 不,将两个字符串文字并排放置会使 C 编译器将它们连接起来。 不,编译器将连接字符串。在编译时,字符串将产生“abc #00ff00” 我相信 "abc ""#00ff00""abc #00ff00" 的连接是由编译器而不是预处理器执行的。 gcc.gnu.org/onlinedocs/cpp/Stringification.html第二段通知:The preprocessor will replace the stringified arguments with string constants. The C compiler will then combine all the adjacent string constants into one long string.【参考方案2】:
#define COLOR "#00ff00"
f("abc "COLOR);

【讨论】:

我认为这是值得注意的,因为如果两个字符串之间没有任何内容,C 会“自动连接”它们。

以上是关于在带引号的字符串中展开宏[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Hive 在带引号的字段中使用逗号加载 CSV

C语言宏定义字符串参数要把参数转化成字符串再加引号才是参数么? #define PRINT(FOR

ztree怎么设置点击节点展开

魔兽世界技能宏如何制作```

c语言中的“宏”是指啥?

linux宏定义