【问题标题】: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\"");

【问题讨论】:

标签: c macros c-preprocessor c-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 会“自动连接”它们。
猜你喜欢
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 2011-04-16
  • 2014-01-05
  • 1970-01-01
相关资源
最近更新 更多