2010-04-02 4 views
37

Macro per GCC/G ++ per differenziare Linux e Mac OSX?Macro per GCC/G ++ per differenziare Linux e Mac OSX?

+0

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) –

risposta

87

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

+1 Funziona come un incantesimo! Come non posso saperlo! Grazie! – Viet

+1

@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

+38

cpp -dM/dev/null funziona anche, nessun file aggiuntivo necessario. – Barry

11

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.

+1

Grazie ma evito autoconf. Voglio solo usare semplici macro. – Viet

+1

+1 per il collegamento "predef". – noamtm

+0

+1 per il collegamento "predef". Ci sono molto di più definisce un livello più alto nella wiki. Lasciami migliorare la tua risposta. – Mecki

4

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.

+0

__APPLE__ copre Mac OS X e iOS, quindi è una scelta migliore di __MACH__ IMHO. È anche più comune dalla mia esperienza –

+0

@ Hans-ChristophSteiner APPLE NON è definito su OS X. – lang2

+0

Immagino che @Hans significhi '__APPLE__'? Ma anche allora non sono sicuro che sia affidabile al 100%? –

8

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.

+0

Sì, ho scelto questo modo nel mio codice. Ho solo Linux e Apple quindi nessun problema. Grazie. – Viet

+2

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 –

+0

@ Hans-Christoph: Un buon ambiente di compilazione incrociata dovrebbe esserci d'aiuto. –