Препроцессор #if в Objective C неправильно оценивает? - PullRequest
0 голосов
/ 30 августа 2018

У меня есть код, который говорит (буквально):

#define BUILD_PLATFORM ios
#if BUILD_PLATFORM==macos
#import <AppKit/AppKit.h>
#elif BUILD_PLATFORM==ios
#import <UIKit/UIKit.h>
#endif

Однако, когда я пытаюсь построить проект, он все еще пытается импортировать AppKit / AppKit.h, сообщая об ошибке, что заголовок не может быть найден.

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

При использовании CMake работает:

CMakeLists.txt:

add_definitions(-DPLATFORM=${PLATFORM})  # Set to the target platform

Цель C:

#if defined(PLATFORM_macos)
#import <AppKit/AppKit.h>
#elif defined(PLATFORM_ios)
#import <UIKit/UIKit.h>
#endif
0 голосов
/ 30 августа 2018

Проблема с C-препроцессором заключается в том, что он может сравнивать только цифры. И ios, и macos являются литералами, которые на самом деле нельзя сравнивать. Сначала вы должны определить их, например,

#define ios 1
#define macos 2

Однако, если вы это сделаете, используйте более подходящие имена, которые не будут конфликтовать с вашим кодом.

Если вы хотите узнать, как Apple это делает, посмотрите файл «Availability.h», который доступен для iOS и Mac OS, и, вероятно, это то, что вам следует использовать, например:

#ifdef __MAC_OS_X_VERSION_MAX_ALLOWED
#import <AppKit/AppKit.h>
#else
#import <UIKit/UIKit.h>
#endif
...