是否可以编写一个将macroName("hello world")
扩展为HelloWorld
的C预处理器宏?
我想将它用于Objective-C中的测试,而不是:
- (void)testBreathingFrequenciesEuqalWhenIdentical { ... }
我可以写:
- (void)testThat("breathing frequencies equal when identical") { ... }
答案 0 :(得分:1)
不,一旦成为字符串文字,总是字符串文字
答案 1 :(得分:0)
不,C预处理器无法将字符串转换为标记。它也没有改变案例的能力。
最常用的方法是执行相反的任务:将令牌转换为字符串。以下宏适用于此:
#define XSTR(a) #a
#define STR(a) XSTR(a)
#define XCAT(a,b) a##b
#define CAT(a,b) XCAT(a,b)
STR(a)
正在将令牌转换为字符串,因此STR(abc)
会提供"abc"
。 CAT(a,b)
将两个令牌连接到一个新令牌,因此CAT(foo,bar)
会给foobar
。 (XCAT和XSTR会做同样的事情,除非它们不扩展参数)
所以你可以编写像testThatV(Breating,Frequencies,Equal,When,Identical)
这样的宏,它可以将其参数转换为token和string。无论如何,您将需要一组宏,如testThatI(a)
,testThatII(a,b)
,testThatIII(a,b,c)
等,因为标准预处理器无法处理可变数量的参数。