Может ли препроцессор расширять макросы Objective-C до нескольких строк? - PullRequest
0 голосов
/ 05 февраля 2019

Имея этот макрос:

#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 голосов
/ 06 февраля 2019

Да, вы можете определить многострочные макросы (используйте \ в конце строки), и макросы могут расширяться до нескольких строк (хотя это технически не нужно, поскольку C / Obj-C игнорирует большинство пробелов).

Но реальный ответ таков: не делайте этого

Эта глобальная функция (а) создаст эквивалентный исходный код в качестве вашего макроса и (б) фактически сгенерирует меньше машинного кода.(Ваш макрос генерирует одни и те же вызовы диспетчеризации снова и снова, в то время как эта функция инкапсулирует их в один блок кода.)

// 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");
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...