Saya perlu kode saya untuk melakukan hal-hal yang berbeda berdasarkan sistem operasi yang dikompilasi. Saya mencari sesuatu seperti ini:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
Apakah ada cara untuk melakukan ini? Apakah ada cara yang lebih baik untuk melakukan hal yang sama?
c
operating-system
c-preprocessor
conditional-compilation
perimosocordiae
sumber
sumber
C
tidakC++
Jawaban:
The Predefined Macro untuk OS situs memiliki daftar yang sangat lengkap cek. Berikut adalah beberapa di antaranya, dengan tautan ke tempat mereka ditemukan:
Windows
_WIN32
Baik 32 bit dan 64 bit_WIN64
64 bit sajaUnix (Linux, * BSD, Mac OS X)
Lihat pertanyaan terkait ini pada beberapa kesulitan menggunakan cek ini.
unix
__unix
__unix__
Mac OS X
__APPLE__
__MACH__
Keduanya didefinisikan; memeriksa apakah harus bekerja.
Linux
__linux__
linux
Usang (tidak sesuai dengan POSIX)__linux
Sudah usang (tidak sesuai dengan POSIX)FreeBSD
__FreeBSD__
Android
__ANDROID__
sumber
__unix__
. Mengapa Anda memasukkannya ke dalam daftar?unix
simbol dan tidak mendefinisikan simbolwin32
, jadi berhati-hatilah. OTOH itu memang mendefinisikan__CYGWIN__
.__linux__
sama__ANDROID__
??tampilkan definisi GCC di Windows:
di Linux:
Makro yang telah ditentukan sebelumnya di MinGW:
di UNIXes:
sumber
Berdasarkan nadeausoftware dan jawaban Lambda Fairy .
Diuji dengan GCC dan dentang:
sumber
Dalam kebanyakan kasus, lebih baik untuk memeriksa apakah fungsionalitas yang diberikan ada atau tidak. Misalnya: apakah fungsi itu
pipe()
ada atau tidak.sumber
sumber
Macro Standar Microsoft C / C ++ (MSVC) yang telah ditentukan dapat ditemukan di sini
Saya pikir Anda mencari:
kompiler gcc PreDefined MAcros dapat ditemukan di sini
Saya pikir Anda mencari:
Lakukan google untuk kompiler yang sesuai yang telah ditentukan sebelumnya.
sumber
Tidak ada standar makro yang diatur sesuai dengan standar C. Beberapa kompiler C akan menetapkan satu pada beberapa platform (misalnya GCC yang ditambal Apple menetapkan makro untuk menunjukkan bahwa ia mengkompilasi pada sistem Apple dan untuk platform Darwin). Platform Anda dan / atau kompiler C Anda mungkin mengatur sesuatu juga, tetapi tidak ada cara umum.
Seperti kata hayalci, yang terbaik adalah mengatur makro ini dalam proses pembuatan Anda. Mudah untuk mendefinisikan makro dengan sebagian besar kompiler tanpa memodifikasi kode. Anda dapat dengan mudah berpindah
-D MACRO
ke GCC, yaituDan dalam kode Anda:
sumber
Pada MinGW,
_WIN32
centang define tidak berfungsi. Inilah solusinya:Untuk informasi lebih lanjut, lihat: https://sourceforge.net/p/predef/wiki/OperatingSystems/
sumber
Gunakan
#define OSsymbol
dan di#ifdef OSsymbol
mana OSsymbol adalah#define
simbol yang dapat mengidentifikasi OS target Anda.Biasanya Anda akan menyertakan file header pusat yang mendefinisikan simbol OS yang dipilih dan menggunakan direktori dan perpustakaan spesifik OS untuk mengkompilasi dan membangun.
Anda tidak menentukan lingkungan pengembangan Anda, tapi saya cukup yakin kompiler Anda memberikan definisi global untuk platform dan OS umum.
Lihat juga http://en.wikibooks.org/wiki/C_Programming/Preprocessor
sumber
Singkatnya, berikut adalah banyak tautan bermanfaat.
libportable
sumber
Maaf untuk referensi eksternal, tapi saya pikir ini cocok untuk pertanyaan Anda:
C / C ++ tip: Cara mendeteksi tipe sistem operasi menggunakan makro yang telah ditentukan sebelumnya
sumber
Anda dapat menggunakan
Boost.Predef
yang berisi berbagai makro yang telah ditentukan sebelumnya untuk platform target termasuk OS (BOOST_OS_*
). Ya, peningkatan sering dianggap sebagai pustaka C ++, tetapi yang ini adalah tajuk preprosesor yang bekerja dengan C juga!Sebagai contoh
Daftar lengkap dapat ditemukan di
BOOST_OS
makro sistem operasisumber
Saya tidak menemukan definisi Haiku di sini. Agar lengkap, definisi Haiku-os sederhana
__HAIKU__
sumber
Beberapa kompiler akan menghasilkan #define yang dapat membantu Anda dengan ini. Baca dokumentasi kompiler untuk menentukan apa itu. MSVC mendefinisikan satu itu
__WIN32__
, GCC memiliki beberapa yang dapat Anda lihattouch foo.h; gcc -dM foo.h
sumber
Anda dapat menggunakan arahan pra-prosesor sebagai peringatan atau kesalahan untuk memeriksa pada waktu kompilasi Anda tidak perlu menjalankan program ini sama sekali, cukup kompilasi saja.
sumber
Saya menulis perpustakaan kecil untuk mendapatkan sistem operasi tempat Anda berada, dapat diinstal menggunakan clib (manajer paket C), jadi sangat mudah untuk menggunakannya sebagai ketergantungan untuk proyek Anda.
Install
Pemakaian
Ini mengembalikan string (
char*
) dengan nama sistem operasi yang Anda gunakan, untuk informasi lebih lanjut tentang proyek ini, periksa dokumentasi di Github .sumber