C预处理器宏将“hello world”扩展为HelloWorld

时间:2014-04-03 11:56:49

标签: objective-c c

是否可以编写一个将macroName("hello world")扩展为HelloWorld的C预处理器宏?

我想将它用于Objective-C中的测试,而不是:

- (void)testBreathingFrequenciesEuqalWhenIdentical { ... }

我可以写:

- (void)testThat("breathing frequencies equal when identical") { ... }

2 个答案:

答案 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)等,因为标准预处理器无法处理可变数量的参数。