iphone - 如何创建包含多行代码的宏?

标签 iphone objective-c cocoa cocoa-touch

我想制作一个宏来注入(inject)一些代码,比如:

if (foo) {
[Bar fooBar];
}

然后,在我需要的地方,我将 FOOBAR 放入代码中。不确定,但在编译时,编译器会将其替换为上面示例中的实际代码。也许我可以使用与宏不同的东西?

最佳答案

使用\转义您希望成为宏一部分的每个换行符。

但是,请注意,如果不小心,使用这样的宏可能会隐藏结构。以你的例子为例:

if (bar)
    FOOBAR();
else
    do_something_else();

猜猜这会扩展到什么。可能不是你想的那样。这是编译器看到的(缩进调整):

if (bar)
    if (foo)
        {
            [Bar fooBar];
        }
;
    else
        do_something_else();

糟糕!该分号是一个单独的空语句。每个 if 只需要一个语句;第一个 if 的语句是第二个 if,第二个 if 的语句是复合语句 ({…} ),因此他们都达到了配额,将分号排除在外。

所以分号没有绑定(bind)到 if——它是无条件的。当您随后尝试将 else 应用于无条件语句时,这会导致语法错误。

修复方法虽然丑陋,但将 FOOBAR 的内容包装在 do…while 语句中:

#define FOOBAR()       \
    do {                \
        if (foo)         \
            [Bar fooBar]; \
    } while(0) /*semicolon omitted*/

因为我们在宏定义中省略了分号,所以 do...while 是一个未终止的语句,因此宏用法之外的分号将绑定(bind)到它。然后我们展开的代码如下所示:

//First, the unexpanded code again
if (bar)
    FOOBAR();
else
    do_something_else();

//Expanded
if (bar)
    do
        {
            if (foo)
                [Bar fooBar];
        }
    while(0);
else
    do_something_else();

else 现在按照您的预期绑定(bind)到 if (bar)

关于iphone - 如何创建包含多行代码的宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1374107/

相关文章:

iphone - 为什么这会导致内存泄漏

ios - 无法在iPhone 5s上安装应用

objective-c - 如何让 xcode 8 对可为空的 block 指针发出警告?

iphone - 在 iOS 5 中使用弃用的方法

iphone - 获取自定义 UIView 子类以跟随 UIControl

ios - 如何使用 OpenGl ES 在 Xcode 中减小立方体上的 4 个面的大小

cocoa - NSOpenPanel 关闭后执行某些操作

objective-c - 如何使用 CATransition 在 Cocoa 中切换 View Controller ?

cocoa - 如何在 NSTableView 中设置列​​边距?

Android/Iphone 设备数据在网络应用程序中的区别?