Можно ли использовать директивы препроцессора для импорта различных заголовочных файлов для Mac и iOS? - PullRequest
8 голосов
/ 25 января 2011

Я пишу библиотеку классов для Mac OS X и iOS, которая будет выпущена в виде Cocoa Framework для OS X и статической библиотеки для iOS.Чтобы упростить дело, я намерен использовать несколько целей в XCode.Тем не менее, классы в Mac OS X связаны с Cocoa.h, тогда как в iOS они связаны с Foundation.h.

Мои вопросы в основном следующие:

  • Может ли ссылка на платформу Mac OS Xвместо Foundation.framework вместо этого?Классы, используемые в рамках, - это NSString, NSMutableString и NSMutableArray.
  • Или я мог бы использовать директивы препроцессора в файлах заголовков для управления включением структуры, например,

    #ifdef MacOSX
        #import <Cocoa/Cocoa.h>
    #else
        #import <Foundation/Foundation.h>
    #endif
    

Ответы [ 4 ]

21 голосов
/ 25 января 2011

Вы можете использовать их для разделения зависимого от платформы кода (см. TargetConditionals.h):

#ifdef TARGET_OS_IPHONE 
    // iOS
#elif defined TARGET_IPHONE_SIMULATOR
    // iOS Simulator
#elif defined TARGET_OS_MAC
    // Other kinds of Mac OS
#else
    // Unsupported platform
#endif

Вот полезный график .

8 голосов
/ 26 августа 2011

Работает как шарм:

#ifdef __APPLE__
  #include "TargetConditionals.h"

  #if TARGET_IPHONE_SIMULATOR  
  // ios simulator

  #elif TARGET_OS_IPHONE
  // ios device

  #elif TARGET_OS_MAC
  // mac os 

  #else
  // Unsupported platform
  #endif
#endif
2 голосов
/ 25 января 2011
  • Может ли инфраструктура Mac OS X связываться с Foundation.framework? Классами, используемыми в рамках, являются NSString, NSMutableString и NSMutableArray.

Попробуй и посмотри. Если компиляция не удалась, нет. Если это удастся, да.

  • Или я могу использовать директивы препроцессора в заголовочных файлах для управления включением фреймворка, например,

Да, вы можете. На самом деле, я считаю, что это единственный способ сделать это.

1 голос
/ 02 октября 2012

Это прекрасно работает для меня:

#ifdef __IPHONE_OS_VERSION_MAX_ALLOWED
//iOS 
#else
//Mac
#endif
...