宏编译器错误:当参数名称出现在别处时出现“解析问题”
Posted
技术标签:
【中文标题】宏编译器错误:当参数名称出现在别处时出现“解析问题”【英文标题】:Macro compiler error: "Parse Issue" when an argument name appears elsewhere 【发布时间】:2013-01-07 19:48:29 【问题描述】:我尝试制作一个简单的宏来在 ios 中创建和显示一个简单的“ok”对话框:
#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 结构?或者是别的什么?
【问题讨论】:
【参考方案1】:您的宏的问题在于 message
中的 两次出现
... [[UIAlertView alloc] initWithTitle:(title) message:(message) ...
被@"Message"
替换,导致
.... [[UIAlertView alloc] initWithTitle:(@"Warning") @"Message":(@"Message") ...
这会导致语法错误。
我认为将其定义为宏并不值得,但如果这样做,则必须使用不会出现在不应扩展的地方的宏参数,例如
#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 )
或类似的。
【讨论】:
啊,哈!我知道这很愚蠢......那个宏没有理由不能工作【参考方案2】:您可以将其声明为 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];
【讨论】:
没错,工作做得一样好,但如果我真的关心堆栈开销怎么办?以上是关于宏编译器错误:当参数名称出现在别处时出现“解析问题”的主要内容,如果未能解决你的问题,请参考以下文章
从 rexx 代码向 ispf 宏传递参数时出现无效长度错误
[VC6]ONMESSAGE()宏编译时出现"sytax error ;"错误时