在"if"语句中使用#define

Jon*_*nah 4 objective-c conditional-compilation ios c-preprocessor

是否可以#define在"if"语句中使用?以下代码有效,但我收到一条警告,即宏正在重新定义.

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
 #define TableViewHeight 916
 #define DisplayHeight 1024
 #define DisplayWidth 768
}
else {
 #define TableViewHeight 374
 #define DisplayHeight 480
 #define DisplayWidth 320
}
Run Code Online (Sandbox Code Playgroud)

我也试过这个,但它没有用:

#ifdef UIUserInterfaceIdiomPad
 #define TableViewHeight 916
 #define DisplayHeight 1024
 #define DisplayWidth 768
#else
 #define TableViewHeight 374
 #define DisplayHeight 480
 #define DisplayWidth 320
#endif
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

CB *_*ley 7

是的,这是可能的,但它可能没有你想的那样做.在编译预处理步骤的结果之前解释预处理程序指令.

这意味着所有的预处理程序指令都被解释,重新定义了一些宏,然后编译剩余的代码,如下所示.

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
}
else {
}
Run Code Online (Sandbox Code Playgroud)

换句话说,在预处理之后,你只有空ifelse身体.

如果你想在运行时根据条件更改某些东西的值,那么某些东西必须是一个真正的对象,而不仅仅是一个预处理器宏.例如

extern int TableViewHeight; // defined somewhere else
extern int DisplayHeight; // defined somewhere else
extern int DisplayWidth; // defined somewhere else

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
  TableViewHeight = 916;
  DisplayHeight = 1024;
  DisplayWidth = 768;
}
else {
  TableViewHeight = 374;
  DisplayHeight = 480;
  DisplayWidth = 320;
}
Run Code Online (Sandbox Code Playgroud)