Macro per GCC/G ++ per differenziare Linux e Mac OSX?Macro per GCC/G ++ per differenziare Linux e Mac OSX?
risposta
La prossima volta che si desidera controllare macro predefinite supportate da GCC su una piattaforma, eseguire il preprocessore con il flag -dM
. Elencherà tutte le macro predefinite disponibili sul sistema. Per esempio:
$ touch dummy.hxx
$ cpp -dM ./dummy.hxx
#define __DBL_MIN_EXP__ (-1021)
#define __FLT_MIN__ 1.17549435e-38F
#define __CHAR_BIT__ 8
#define __WCHAR_MAX__ 2147483647
#define __DBL_DENORM_MIN__ 4.9406564584124654e-324
#define __FLT_EVAL_METHOD__ 0
#define __DBL_MIN_10_EXP__ (-307)
#define __FINITE_MATH_ONLY__ 0
#define __SHRT_MAX__ 32767
#define __LDBL_MAX__ 1.18973149535723176502e+4932L
#define __UINTMAX_TYPE__ long unsigned int
#define __linux 1
#define __unix 1
#define __linux__ 1
...
+1 Funziona come un incantesimo! Come non posso saperlo! Grazie! – Viet
@Viet: Prego ... in realtà mi sono imbattuto in un enigma simile al tuo di recente. Volevo sapere se c'era una macro predefinita che indicava l'ordine dei byte della macchina. Mi sono imbattuto in questa oscura documentazione dopo ore e ore di ricerche! – themoondothshine
cpp -dM/dev/null funziona anche, nessun file aggiuntivo necessario. – Barry
sarei più propenso a provare la disponibilità di funzionalità di nome della piattaforma. Prova a utilizzare autoconf.
Altrimenti, questo è a comprehensive list of platform defines.
anche check out this page per quanto riguarda definisce compilatori, librerie, architetture e dispositivi.
Io uso __MACH__
di prova per Mac OS X - non è al 100% unica per Mac OS X (ci possono essere ancora alcune vecchie caselle accanto là fuori!), Ma è abbastanza buono per dire la differenza tra Mac e Linux.
__APPLE__ copre Mac OS X e iOS, quindi è una scelta migliore di __MACH__ IMHO. È anche più comune dalla mia esperienza –
@ Hans-ChristophSteiner APPLE NON è definito su OS X. – lang2
Immagino che @Hans significhi '__APPLE__'? Ma anche allora non sono sicuro che sia affidabile al 100%? –
Rileva OSX con la __APPLE__
macro se è necessario. È meglio usare configure
per rilevare le funzionalità, se possibile, ma non tutto funziona bene in questo modo.
Sì, ho scelto questo modo nel mio codice. Ho solo Linux e Apple quindi nessun problema. Grazie. – Viet
Trovo l'utilizzo di macro compilatore definita come '__APPLE__' molto utile perché è possibile separare il codice dal sistema di compilazione, un sacco di tempo. Quindi ti rende molto più facile quando esegui il porting su piattaforme esoteriche come Android o Chrome NaCl, che non necessariamente giocano con './Configure' e gli amici –
@ Hans-Christoph: Un buon ambiente di compilazione incrociata dovrebbe esserci d'aiuto. –
possibile duplicato di [? Come faccio a controllare OS con una direttiva del preprocessore] (http://stackoverflow.com/questions/142508/how-do-i-check-os-with-a -precedente -programmaprocessore) –