Да, это действительно;раскрытие макроса происходит еще до того, как компилятор прочитает код.Основным ограничением является то, что нельзя включать директиву препроцессора в директиву препроцессора.Так, например:
// This is ok:
#define PREFIX(X) this_name_is_prefixed_ ## X
// ...
- (void) PREFIX(doSomething):id;
// ...
// But this isn't:
#define IMPORT(X) #import X
IMPORT(<Foundation/Foundation.h>) // <= Don't expect this to work
За исключением директивы "#import", препроцессор Objective-C в основном такой же, как препроцессор C .(«#Import» похож на «#include», за исключением того, что «#import» подразумевает включение только один раз, поэтому защита заголовков препроцессора не требуется для заголовков, которые включены только в «#import»).