0

我正在尝试连接两个值,每个值都定义为宏。此刻我已经:

#define VAL1 @"im/"
#define VAL2 @"test"
#define GLUE_IN(x,y) (x ## y)
#define GLUE(x,y) GLUE_IN(x,y)

当我在代码中使用它时:

[array addObject:GLUE(VAL1, VAL2)];

它给我一个错误:粘贴形成的'“im /”@',一个无效的预处理令牌

我知道它可以通过以下方式解决:

#define GLUE(x,y) [NSString stringWithFormat:@"%@%@",x,y]

但是我很好奇是否可以使用预处理器来实现相同的结果?

4

2 回答 2

2

##连接标记,而不是字符串,这会导致无效的结果标记,在这种情况下是完全不必要的,因为@"im/" @"test"- 作为编译时字符串常量 - 无论如何都会被附加。做就是了;

#define GLUE_IN(x,y) (x y)

...这将导致

[array addObject:@"im/" @"test"]

...而且事情应该运作良好。

于 2013-08-05T09:45:38.420 回答
0

我不会问你为什么需要它,但这里有可能的解决方案:

#define VAL1 im
#define VAL2 test
#define STR2(x) #x
#define STR(x) STR2(x)
#define GLUE_IN(a,b) a##b
#define GLUE(x,y) GLUE_IN(x,y)

…</p>

NSString *val1 = @(STR(GLUE(VAL1, VAL2)));
NSString *val2 = @"another " @"test";
NSLog(@"%@, %@", val1, val2);

它给你

测试,另一个测试

但是,使用斜线符号会有一些麻烦。如果我是你,我会选择另一种方式。

于 2013-08-05T10:10:10.637 回答