宏编译器错误:当参数名称出现在别处时出现“解析问题”

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 ;"错误时

VS2008 编译时出现的错误:无法打开编译器中间文件。如何解决?

当我尝试将函数的参数设置为默认值时出现意外错误

仅在WinXP计算机上安装WiX时出现错误2259

在项目 Xamarin.Forms 中构建时出现错误“值不能为空参数名称:方​​法”