Saya sedang menulis kode lintas platform, yang harus dikompilasi di linux, windows, Mac OS. Di windows, saya harus mendukung studio visual dan mingw.
Ada beberapa bagian kode khusus platform, yang harus saya tempatkan di #ifdef .. #endif
lingkungan. Misalnya, di sini saya menempatkan kode khusus win32:
#ifdef WIN32
#include <windows.h>
#endif
Tapi bagaimana cara mengenali linux dan mac OS? Apa definisi nama (atau dll.) Yang harus saya gunakan?
c++
macros
cross-platform
c-preprocessor
Arenim
sumber
sumber
Jawaban:
Untuk Mac OS :
Untuk MingW di Windows:
Untuk Linux :
Untuk kompiler Windows lainnya, periksa utas ini dan ini untuk beberapa kompiler dan arsitektur lainnya.
sumber
__APPLE__
membedakan antara OSX dan iOS?__APPLE__
disetel untuk OS X dan iOS. Anda bisa#include <TargetConditionals.h>
masuk#ifdef __APPLE__
, yang kemudian memberi AndaTARGET_OS_IPHONE #define
.__MINGW64__
juga tersedia jika seseorang menggunakan mingw64__MINGW64__
direferensikan, berpikir_MSC_VER
untuk Windows / MSVC layak disebutkan (yang juga dapat digunakan untuk memeriksa Versi MSVC).Lihat: http://predef.sourceforge.net/index.php
Proyek ini menyediakan daftar lengkap yang ditentukan sebelumnya
#defines
untuk banyak sistem operasi, penyusun, standar bahasa dan platform, dan pustaka standar.sumber
Inilah yang saya gunakan:
EDIT: Meskipun hal di atas mungkin berfungsi untuk dasar-dasar, ingatlah untuk memverifikasi makro apa yang ingin Anda periksa dengan melihat halaman referensi Boost.Predef . Atau gunakan saja Boost.Predef secara langsung.
sumber
#if
jika ditentukan, yang lain menguji nilai. Jika akan lebih konsisten untuk dilakukan#elif defined(__unix__)
, dll, saya pikir.Jika Anda menulis C ++, saya tidak bisa merekomendasikan penggunaan pustaka Boost dengan cukup kuat.
Versi terbaru (1.55) menyertakan pustaka Predef baru yang mencakup persis apa yang Anda cari , bersama dengan lusinan platform lain dan makro pengenalan arsitektur.
sumber