预处理程序可以将Objective-C宏扩展到多行吗?

时间:2019-02-05 09:07:31

标签: objective-c macros

具有此宏:

#define RUN_ON_MAIN_THREAD(block) dispatch_async(dispatch_get_main_queue(), block)

及其用法:

RUN_ON_MAIN_THREAD(^{
    NSLog(@"first line");

    NSLog(@"second line");
});

它扩展为:

dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"first line"); NSLog(@"seconds line"); });

这使得不可能在NSLog(@"second line");的行上有一个工作断点。

有什么方法可以使其扩展为:

dispatch_async(dispatch_get_main_queue(), ^{
    NSLog(@"first line");

    NSLog(@"seconds line");
});

1 个答案:

答案 0 :(得分:0)

是的,您可以定义多行宏(在行的末尾使用\),并且宏可以扩展为多行(尽管在技术上是不必要的,因为C / Obj-C会忽略大多数空白)。 / p>

但真正的答案是:不要这样做

此全局函数将(a)生成与您的宏等效的源代码,并且(b)实际上将生成较少的机器代码。 (您的宏会反复生成相同的调度调用,而此函数将它们封装在一个代码块中。)

// Shorthand for asynchronously dispatching a block to execute on the main thread
void DispatchOnMain( dispatch_block_t block )
{
    dispatch_async(dispatch_get_main_queue(),block);
}

您的代码将如下所示:

DispatchOnMain(^{
    NSLog(@"first line");

    NSLog(@"second line");
});