宏编译器错误

时间:2013-01-07 19:48:30

标签: objective-c ios preprocessor-directive

我尝试制作一个快速宏来在iOS中创建和显示一个简单的“确定”对话框:

#define ALERT_DIALOG(title,message) \
do\
{\
    UIAlertView *alert_Dialog = [[UIAlertView alloc] initWithTitle:(title) message:(message) delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];\
    [alert_Dialog show];\
} while ( 0 )

如果我尝试在我的代码中使用它:

ALERT_DIALOG(@"Warning", @"Message");

我收到错误:

  

解析问题。预期 ']'

错误似乎指向@之前的第二个"Message"

但是,如果我只是复制粘贴宏,我不会收到此错误:

NSString *title = @"Warning";
NSString *message = @"Message";
do
{
    UIAlertView *alert_Dialog = [[UIAlertView alloc] initWithTitle:(title) message:(message) delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert_Dialog show];
} while ( 0 );

是否存在反对在宏中使用Objective-c结构的内容?或者我只是做了一些相当愚蠢的事情,我找不到

2 个答案:

答案 0 :(得分:1)

宏的问题在于 {/ 1>}中的

message

替换为... [[UIAlertView alloc] initWithTitle:(title) message:(message) ... ,结果为

@"Message"

,这会导致语法错误。

我不认为将它定义为宏是值得的,但是如果你这样做,你必须使用宏参数,这些参数不会出现在不应该扩展的地方,例如。

.... [[UIAlertView alloc] initWithTitle:(@"Warning") @"Message":(@"Message") ...

或类似。

答案 1 :(得分:0)

不是将其声明为宏,而是将其声明为C函数:

void ALERT_DIALOG(NSString *title, NSString *message) {
    UIAlertView *alert_Dialog = [[UIAlertView alloc] initWithTitle:(title) message:(message) delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];\
    [alert_Dialog show];
}