逗号在宏内部的语句中被误解为宏参数分隔符

时间:2011-07-20 20:50:05

标签: iphone objective-c macros

我刚刚创建了一个Xcode项目并编写了以下代码:

#define foo(x) x
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    int n = 666;
    NSString* string = foo([NSString stringWithFormat: @"%d", n]);
    NSLog (@"string is %@", string);
    [self.window makeKeyAndVisible];
        return YES;
}

当我尝试运行它时,我得到了一堆错误,因为预处理器决定stringWithFormat之后的逗号:应该分隔两个宏参数,因此我使用了foo和两个参数而不是正确的参数

所以当我想在我的宏内部的语句中使用逗号时,我该怎么办?

This C++ question建议在逗号周围放置一些圆形的parens(),这显然导致预处理器意识到逗号不是宏参数分隔符。但在我的头脑中,我并没有想到在目标C中这样做的方法。

3 个答案:

答案 0 :(得分:5)

在通话中添加额外的括号:

NSString* string = foo(([NSString stringWithFormat:@"%d",n]));

答案 1 :(得分:0)

将它分开可行,但可能有一种更简单的方式

NSString* stringBefore = [NSString stringWithFormat:@"%d",n];
NSString* string = foo(stringBefore);

答案 2 :(得分:0)

尝试NSString * string = foo([NSString stringWithFormat:(@“%d”,n)]);

否则,请尝试卡特的方法,它的工作正常。