2011-05-07 23 views

cevap

405

Çoğu derleyici tarafından kullanılan önceden tanımlı makrolar vardır, listeyi [here] bulabilirsiniz. GCC derleyici önceden tanımlanmış makroları [here] bulunabilir.

#ifdef _WIN32 
    //define something for Windows (32-bit and 64-bit, this part is common) 
    #ifdef _WIN64 
     //define something for Windows (64-bit only) 
    #else 
     //define something for Windows (32-bit only) 
    #endif 
#elif __APPLE__ 
    #include "TargetConditionals.h" 
    #if TARGET_IPHONE_SIMULATOR 
     // iOS Simulator 
    #elif TARGET_OS_IPHONE 
     // iOS device 
    #elif TARGET_OS_MAC 
     // Other kinds of Mac OS 
    #else 
    # error "Unknown Apple platform" 
    #endif 
#elif __linux__ 
    // linux 
#elif __unix__ // all unices not caught above 
    // Unix 
#elif defined(_POSIX_VERSION) 
    // POSIX 
#else 
# error "Unknown compiler" 
#endif 

Bu tanımlı macroses

Kullanmak için gidiyoruz derleyici bağlıdır: İşte gcc için bir örnektir.

_WIN64#ifdef Windows, sadece x86 sürümünü hedeflerken tanımlanır _WIN32#ifdef çünkü _WIN32 içine iç içe olabilir. Bu, bazılarının her ikisinde de ortak olması durumunda kod çoğaltmayı önler.

+0

OP özellikle "Mac OS X" ile "iOS" –

+4

@ Paul hakkında sorulan, "kod Mac OS X, iOS, Linux, Windows" derlenmelidir " –

+0

@Paul, @Egenjim Hatam için üzgünüm . Soruma Windows ve Linux dahildir. – Eonil

27

Jake'in belirttiği gibi, TARGET_IPHONE_SIMULATOR, TARGET_OS_IPHONE öğesinin bir alt kümesidir.

Ayrıca TARGET_OS_IPHONE, TARGET_OS_MAC'ın bir alt kümesidir.

Yani daha iyi bir yaklaşım olabilir: Bir doğal sonucu cevabın

#ifdef _WIN64 
    //define something for Windows (64-bit) 
#elif _WIN32 
    //define something for Windows (32-bit) 
#elif __APPLE__ 
    #include "TargetConditionals.h" 
    #if TARGET_OS_IPHONE && TARGET_IPHONE_SIMULATOR 
     // define something for simulator 
    #elif TARGET_OS_IPHONE 
     // define something for iphone 
    #else 
     #define TARGET_OS_OSX 1 
     // define something for OSX 
    #endif 
#elif __linux 
    // linux 
#elif __unix // all unices not caught above 
    // Unix 
#elif __posix 
    // POSIX 
#endif 
+0

Ayrıca, __linux__' üzerinde '__ANDROID__', Linux'a göre kendi özelliklerini taşıdığından ben de ekleyeceğim. – 4LegsDrivenCat

+0

Bu, Windows'a özgü herhangi bir kodun, hem 32- hem de 64-bit için aynı olmasını gerektirmiyor mu, '_WIN64' ve '_WIN32 'bloklarında çoğaltılabilir mi? _WIN32 'yi algılarsa, _WIN32' yi algılar, bu da istenmeyebilir. [Bu] gibi bir şey (http://pastebin.com/4qTShCq1) daha iyi çalışabilir. –

+0

Benim Linux'um sadece '__linux__',' __gnu_linux__' ve 'linux' tanımlar, ancak '__linux' değil – Mecki

1

Tür: [this site] insanlar her İşletim Sistemi/derleyici çifti için tanımlanan makro tabloları yapmak için zaman almış. mevcut her derleyici (Clang, GNU Windows Cygwin (POSIX olmayan) ve MinGW üzerinde derleme için tanımlanan IS ise

Örneğin,,, _WIN32 Cygwin (POSIX'deki) ile Windows üzerinde tanımlı DEĞİLDİR görebilirsiniz Intel, vb.

Her neyse, tabloları oldukça bilgilendirici buldum ve burada paylaşacağımı düşündüm.

+0

link artık çalışmıyor – katta

+0

@katta tekrar deneyin, benim için çalışıyor ... – houtanb