我尝试制作一个快速宏来在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结构的内容?或者我只是做了一些相当愚蠢的事情,我找不到
答案 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];
}