ifdef语法不起作用

时间:2012-09-21 09:05:43

标签: iphone objective-c ios macros conditional-compilation

我希望根据不同的设备高度动态定义常量。 我尝试使用此代码,但它不起作用:

#define isPhone568 ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone && [UIScreen mainScreen].bounds.size.height == 568)

#ifdef isPhone568
    #define kColumnHeightPortrait568 548
#else
    #define kColumnHeightPortrait568 (IS_IPAD ? 984 : 460)
#endif

即使我使用的是3.5英寸模拟器,我也会得到548.这有什么问题?

2 个答案:

答案 0 :(得分:2)

您无法在宏定义中运行代码,它是在编译时发生的简单文本替换过程。因此,您不知道此时设备的特性是什么,因为您 目标设备。

如果你想使用类似[UIDevice currentDevice] userInterfaceIdiom的东西,你必须在运行时评估它,而不是在编译时宏中,例如:

int kColumnHeightPortrait568 = 548;
if (([[UIDevice currentDevice] userInterfaceIdiom] != UIUserInterfaceIdiomPhone)
   || ([UIScreen mainScreen].bounds.size.height != 568))
{
    kColumnHeightPortrait568 = (IS_IPAD ? 984 : 460);
}

答案 1 :(得分:1)

#ifdef用于检查是否定义了宏。当您在第一行定义isPhone568时,#ifdef isPhone568将为真。

如果要测试表达式的值而不是宏的存在,则应使用#if代替。但是#if只能测试简单的算术表达式,就像 paxdiablo 提到的那样,“你不能在宏定义中运行代码”。