Mac OS X, iOS, Linux, Windows'da derlenmesi gereken bazı çapraz platform C/C++ kodu varsa, ön işlem sırasında bunları nasıl güvenilir bir şekilde algılayabilirim?Güvenilir bir şekilde Mac OS X, iOS, Linux, Windows C önişlemcisi nasıl algılanır?
cevap
Ç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.
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
Ayrıca, __linux__' üzerinde '__ANDROID__', Linux'a göre kendi özelliklerini taşıdığından ben de ekleyeceğim. – 4LegsDrivenCat
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. –
Benim Linux'um sadece '__linux__',' __gnu_linux__' ve 'linux' tanımlar, ancak '__linux' değil – Mecki
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.
OP özellikle "Mac OS X" ile "iOS" –
@ Paul hakkında sorulan, "kod Mac OS X, iOS, Linux, Windows" derlenmelidir " –
@Paul, @Egenjim Hatam için üzgünüm . Soruma Windows ve Linux dahildir. – Eonil