在我的代码中,我有很多代码,如:
if (block) block(....)
所以我想定义一个宏,比如
#define safetyCall(block, ...) if((block)) {block(##__VA_ARGS__)};
但我无法让它发挥作用。有什么想法吗?
答案 0 :(得分:6)
您不需要移动##
和;
:
#define safetyCall(block, ...) if((block)) { block(__VA_ARGS__); }
答案 1 :(得分:2)
如果您的块是内联的并且包含具有一系列逗号分隔字符串的代码等,则会遇到问题。
示例:
safetyCall(^void() {
NSArray *foo = @[@"alice", "bob"];
};
编译器会抱怨“预期']'或'。'”和“预期标识符或'('”。
但是,如果要在宏之前将内联块声明为单独的块,则不会生成错误。
示例:
void (^fooBlock)(void) = ^void() {
NSArray *foo = @[@"alice", @"bob"];
}
safetyCall(fooBlock);