Xcode - макрос работает по-разному в зависимости от того, включен он в файл .h или файл .m? - PullRequest
1 голос
/ 29 июня 2011

Я хочу иметь макрос SomeMacro (город, страна) в файле, который будет находиться в файле MacroFile.h, который я #include включаю из файла .h или .m. И я хочу, чтобы SomeMacro стал чем-то другим, в зависимости от того, является ли файл непосредственно над MacroFile.h в дереве включения файлом .h или .m. Я хочу сделать это без определения специальной константы в файле .m. Это возможно?

В псевдокоде я хочу, чтобы MacroFile.h сделал следующее:

#if (file from which I was directly included is a .h)
#define SomeMacro(city, country) SomeStuffInvolvingCityAndCountry
#else
#define SomeMacro(city, country) SomeDifferentStuffInvolvingCityAndCountry
#endif

SomeMacro(washington, USA)
SomeMacro(tokyo, Japan)
SomeMacro(berlin, Germany)

Бонусные баллы, если вы также можете получить MacroFile.h, чтобы проверить, что на два уровня выше него в дереве включения.

РЕДАКТИРОВАТЬ: Если у макроса есть способ узнать, вызывается ли он из блока @implementation или нет, этого было бы достаточно.

1 Ответ

0 голосов
/ 22 июля 2011

Нет теста препроцессора, чтобы определить, откуда раскрывается макрос. .h является соглашением для заголовочного файла, но не имеет семантического значения.

Вы можете создать два файла MacroFile-header.h и MacroFile-code.h следующим образом:

MacroFile-header.h

// definitions
#define CityCountryMacro(city, country)  SomeStuffInvolvingCityAndCountry
#define StateZipMacro(state, zip)        SomeStuffInvolvingStateAndZip

MacroFile-code.h

// undefine MacroFile-header.h macros
#if defined(CityCountryMacro)
    #undef CityCountryMacro
#endif
#if defined(StateZipMacro)
    #undef StateZipMacro
#endif

// definitions
#define CityCountryMacro(city, country)  OtherStuffInvolvingCityAndCountry
#define StateZipMacro(state, zip)        OtherStuffInvolvingStateAndZip

Всегда импортируйте MacroFile-header.h в заголовочные файлы следующим образом:

SomeObject.h

#import "MacroFile-header.h"

// use macros

и MacroFile-code.h после всех других импортов в вашей реализации:

SomeObject.m

#import "SomeObject.h"
#import ...
#import ...

// always include last
#import "MacroFile-code.h"

// use macros
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...