Можно ли ставить операторы в #define? - PullRequest
3 голосов
/ 22 февраля 2012

Я пытаюсь изменить существующую библиотеку для работы с iPhone и iPad.Я бы хотел изменить пару утверждений:

#define width 320
#define height 50

Я хотел бы сделать что-то вроде:

if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
  #define width X
  #define height Y }
else {
  #define width A
  #define height B
}

Однако, похоже, я не могу этого сделать.Есть ли способ добиться чего-то подобного?Спасибо

Ответы [ 4 ]

2 голосов
/ 22 февраля 2012

Вы можете использовать #if:

 #if TARGET_DEVICE_IPHONE // note this may be different, don't have acces to Xcode right now.
 #define width X
 #define height Y
 #else
 #define width A
 #define height B
 #endif

Или просто создайте простую встроенную функцию:

static inline int width()
{
      return [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone ? X : A;
}

static inline int height()
{
    return [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone ? Y : B;
}
0 голосов
/ 22 февраля 2012

#define - определение препроцессора. Это означает, что это первое, что делается при компиляции. По сути, он просто вставляет определение везде в коде, прежде чем начать компиляцию.

Но так как ваши операторы if выполняются во время выполнения, а не во время компиляции, вам необходимо либо заменить свои операторы if на препроцессор if (#if, не рекомендуется), либо изменить ширину / высоту, определяемую во время выполнения (настоятельно рекомендуется). Это должно выглядеть так:

int width, height;
if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
  width = X;
  height = Y;
else {
  width = A;
  height = B;
}

, а затем просто используйте значения ширины и высоты для своей ширины и высоты.

Если вы все еще хотите пометить X, Y, A, B вместо использования #define (константы времени компиляции), используйте константы времени выполнения:

static const int iPhoneWidth = X;
static const int iPhoneHeight = Y;
static const int iPadWidth = A;
static const int iPadHeight = B;

if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
  width = iPhoneWidth;
  height = iPhoneHeight;
else {
  width = iPadWidth;
  height = iPadHeight;
}
0 голосов
/ 22 февраля 2012

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

#define width (([[UIDevice currentDevice] userInterfaceIdiom] != UIUserInterfaceIdiomPhone) ? A : x)
#define height (([[UIDevice currentDevice] userInterfaceIdiom] != UIUserInterfaceIdiomPhone) ? B : Y)
0 голосов
/ 22 февраля 2012

Как насчет этого:

#define widthPhone 320
#define widthPad 400
#define heightPhone 50
#define heightPad 90

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
    width = widthPhone;
    height = heightPhone;
} else {
    width = widthPad;
    height = heightPad;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...