我希望在一个文件MacroFile.h中有一个宏SomeMacro(city,country),我将从.h文件或.m文件#include。我希望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块中调用的,那就足够了。
答案 0 :(得分:0)
没有预处理器测试来确定宏的扩展位置。 .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