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

Wil*_*sch 1 iphone macros objective-c

我刚刚创建了一个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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

这个C++问题提出了一种方法来围绕逗号放置一些圆形的parens(),这显然导致预处理器意识到逗号不是宏参数分隔符.但是,在我的头脑中,我并没有想到在目标C中这样做的方法.

Car*_*ter 5

在呼叫周围添加额外的括号有效:

NSString* string = foo(([NSString stringWithFormat:@"%d",n]));
Run Code Online (Sandbox Code Playgroud)