宏输出如何双引号

时间:2016-12-09 03:11:49

标签: c macros nested

array = [ "Hey guys, can anyone teach me how to be cool? I really want to be the best at everything, you know what I mean? Tweeting is super fun you guys!!!!", "OMG you guys, you won't believe how sweet my kitten is. My kitten is like super cuddly and too cute to be believed right?", "I'm running out of example tweets for you guys, which is weird, because I'm a writer and this is just writing and I tweet all day. For real, you guys. For real.", "GUISEEEEE this is so fun! I'm tweeting for you guys and this tweet is SOOOO long it's gonna be way more than you would think twitter can handle, so shorten it up you know what I mean? I just can never tell how long to keep typing!", "New game. Middle aged tweet followed by #youngPeopleHashTag Example: Gotta get my colonoscopy and mammogram soon. Prevention is key! #swag" ] rules = { "hello" => "hi", "too" => "2", "to" => "2", "two" => "2", "for" => "4", "four" => "4", "be" => "b", "you" => "u", "at" => "@", "and" => "&" } def substitutor(strings,subs) strings.each_with_index do |string,index| subs.each do |word,substitute| strings[index].gsub!(/\bword\b/, substitute) end end end substitutor(array,rules) 是一个宏,它将输出一些字符串,如下所示:

  

碱/原子/ gcc_gnu_x64

在另一个宏I really want to b the bst at everything中,输出预期为:

  

"碱/原子/ gcc_gnu_x64.hpp" //注意:输出中包含双引号

我尝试编写ATOMIC_JOIN(prefix, detail_platform),例如:

ATOMIC_DETAIL_HEADER

......失败了!

但如果我希望输出是:

  

ATOMIC_DETAIL_HEADER

以下宏定义可以做正确的事情:

#define ATOMIC_DETAIL_HEADER(prefix) "ATOMIC_JOIN(prefix, ATOMIC_DETAIL_PLATFORM).hpp" #define ATOMIC_DETAIL_HEADER(prefix) \"ATOMIC_JOIN(prefix, ATOMIC_DETAIL_PLATFORM).hpp\" #define ATOMIC_DETAIL_HEADER(prefix) "##ATOMIC_JOIN(prefix, ATOMIC_DETAIL_PLATFORM).hpp##"

2 个答案:

答案 0 :(得分:1)

cpp宏无法以这种方式构建字符串。它可以加入令牌以形成新令牌,但在每个阶段它都必须是有效令牌。使用尖括号的示例有效,因为括号字符是不同的标记,而双引号不能像这样浮动,并且您不能将##应用于它。

在大多数情况下,编译器会连接相邻的字符串文字,因此在编译器执行此操作时,#stringify每个部分可能就足够了。

答案 1 :(得分:0)

虽然luser droog正确地陈述了为什么你使用引号不起作用,但他并没有准确地说明如何实现目标。实际上#运算符用字符串文字替换参数,i。即在论证周围加上引号。由于您的令牌序列必须首先扩展,因此需要额外的宏替换级别,这有点复杂:

#define QUOTED(a)   #a
#define QUOTE(a)    QUOTED(a)
#define ATOMIC_DETAIL_HEADER(prefix) QUOTE(ATOMIC_JOIN(prefix, ATOMIC_DETAIL_PLATFORM).hpp)