在带引号的字符串中展开宏[重复]
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 会“自动连接”它们。以上是关于在带引号的字符串中展开宏[重复]的主要内容,如果未能解决你的问题,请参考以下文章