我想制作一个宏来注入(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/