Почему сложение и вычитание двух макросов # define'd не работает на iPhone / Objective-c - PullRequest
2 голосов
/ 19 января 2011

В моем приложении для iPhone это есть в моем .h файле

#define ORIENTATION_IS_PORTRAIT UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation])
#define FULLSCREEN_MODE         ORIENTATION_IS_PORTRAIT?460:300
#define AD_HEIGHT               ORIENTATION_IS_PORTRAIT?50:32
#define FULLSCREEN_MODE_WITH_AD FULLSCREEN_MODE - AD_HEIGHT //doesn't work

Подводя итог, у меня есть макрос для определения ориентации. У меня есть другой для высоты моего UIWebView, когда он находится в полноэкранном режиме (активируется нажатием кнопки). Мне нужно держать рекламу внизу. Однако, чтобы получить высоту UIWebView минус высота объявления вернет только AD_HEIGHT.

Кроме того, (FULLSCREEN_MODE + AD_HEIGHT) возвращает только FULLSCREEN_MODE.

Кроме того, при использовании констант, куда именно я их помещаю. Я искал и мог найти только ответы типа "в файле .m", но где ??

Ответы [ 4 ]

4 голосов
/ 19 января 2011

То, что вы хотите, это чтобы это было так:

#define FULLSCREEN_MODE         (ORIENTATION_IS_PORTRAIT?460:300)
#define AD_HEIGHT               (ORIENTATION_IS_PORTRAIT?50:32)
#define FULLSCREEN_MODE_WITH_AD (FULLSCREEN_MODE - AD_HEIGHT)

Для более сложных выражений, я бы предложил вам обернуть это в do { ... } while(0) вместо того, чтобы просто сгруппировать их вместе.

То, что здесь происходит, это то, что он анализируется как:

UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation]) ? 460 : 300 - UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation]) ? 50 : 32

, что не соответствует той математике, которую вы хотите.

2 голосов
/ 19 января 2011

Окружайте каждый макрос () - это хорошая привычка и избавит вас от неожиданного поведения.

пример:

#define FULLSCREEN_MODE         (ORIENTATION_IS_PORTRAIT?460:300)

Препроцессор выполняет прямую замену одного фрагмента текста другим. Если у вас есть проблемы с порядком операций, скобки спасут вас.

1 голос
/ 19 января 2011

Либо избегайте препроцессора и его путаницы и используйте встроенные функции.

inline BOOL orientationIsPortait() {
    return UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation]);
}


inline int fullscreenMode() {
    return orientationIsPortait() ? 460 : 300;
}

... и т. Д.

Они будут выходить за пределы вашего блока @implementation.

В этом отношении я бы поспорил, что вы не запускаете эти функции, а время от времени, поэтому думать об оптимизации, такой как макросы или встраивание, очень преждевременно и, вероятно, никогда не важно.

0 голосов
/ 19 января 2011

Избегайте макросов. Определите функции. Вы можете объявить их inline.

...