2012-06-23 2 views
1

Я хочу, чтобы определить различные параметры в соответствии с другим устройством, но я получил ошибку компиляции, как показано ниже:Право грамматика #if условие

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 

#if IS_IPAD     //invalid token at start of a preprocessor expression 
#define defaultHeight 475 
#else 
#define defaultHeight 175 
#endif 

Я хочу знать правильную грамматику для моей цели, спасибо!

+0

возможный дубликат [#if Проверьте между Iphone и IPad] (http://stackoverflow.com/questions/3697165/if-check-between-iphone-and-ipad) – rishi

ответ

10

Вы можете сделать:

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
#define DEFAULT_HEIGHT ((IS_IPAD) ? 475.0 : 175.0) 
+0

Да, это то, что я хочу! – itenyh

2

Вы не можете сделать это с помощью препроцессора. Предустановленные макросы препроцессора принимают только выражения постоянной времени компиляции. Используйте C код вместо этого, что-то вроде этого:

float defaultHeight; 
if (IS_IPAD) 
{ 
    defaultHeight = 475; 
} 
else 
{ 
    defaultHeight = 175; 
} 

Кстати, это плохая практика, чтобы дать препроцессор #define макросов имена в нижнем регистре. Если вы хотите использовать макрос для высоты по умолчанию, используйте

#define DEFAULT_HEIGHT value 

вместо этого.

+1

На самом деле, это довольно распространенный Apple-ese для использования макросов в смешанном случае. Даже тогда они по-прежнему обычно вводятся начальные буквы верхнего регистра ('DefaultHeight') и обычно являются префиксом (' NSFooBarWidth') и/или «k» ('kWidgetWeight',' kCFPotatoCount') в начале. Конечно, есть исключения, особенно в более старых (API-интерфейсах Carbon/Cassic). Apple немного нерешительна именно так. –

+0

@JonathanGrynspan Да, и это довольно раздражает, что они часто несовместимы с именованием ... –

+0

Они, как правило, совместимы в определенной структуре. Core Foundation всегда использует 'kCFThisStyle', например. По крайней мере, они пытаются улучшить ситуацию. –