2010-01-30 7 views
31

Durante la lettura di varie fonti C e C++, ho rilevato due macro __APPLE__ e __OSX__. Ho trovato un sacco di uso di __OSX__ in vari codici, in particolare quelli originati dai sistemi *BSD.Quale macro per incapsulare il codice specifico di Mac OS X in C/C++

Tuttavia, a volte trovo che il test __OSX__ non sia sufficiente e devo completare i test con la macro __APPLE__.

I Porting Command Line Unix Tools to Mac OS X guide specifica __APPLE__ e inoltre __APPLE_CC__ ma fa non menzione __OSX__.

La guida Porting from GCC dice:

  • Usa #ifdef __GNUC__ per avvolgere qualsiasi codice specifico GCC.
  • Utilizzare #ifdef __APPLE_CC__ per avvolgere qualsiasi codice specifico per Mac OS X.

Anche in questo caso, nessuna menzione circa __OSX__ macro.

Quale macro è predefinita sulla piattaforma Mac OS X e sull'ambiente di sviluppo XCode da utilizzare per distinguere il codice specifico di OSX nei programmi C/C++?

Dove è definita la macro __OSX__? È la macro specifica *BSD?

+0

Qt utilizza anche una definizione diversa: 'Q_OS_OSX' – math

risposta

20

Tutto dipende.

Ogni macro specifica qualcosa di diverso nel significato.
Vedi: https://developer.apple.com/library/mac/documentation/Porting/Conceptual/PortingUnix/compiling/compiling.html#//apple_ref/doc/uid/TP40002850-SW13

__APPLE__

Questa macro è definita in qualsiasi computer Apple.

__APPLE_CC__

Questa macro è impostato su un numero intero che rappresenta il numero di versione compilatore. Ciò consente di distinguere, ad esempio, tra i compilatori basati sulla stessa versione di GCC, ma con diverse correzioni di bug o funzionalità. Valori più grandi indicano i compilatori successivi.

__OSX__

Presumabley il sistema operativo è una particolare variante di OS X

Quindi date le definizioni di cui sopra avrei usato __APPLE__ distinguere codice specifico di mele.

+0

Sì, ho compreso la differenza delle macro' __APPLE__' e '__APPLE_CC__' - Ho collegato le mie domande alla stessa guida. A proposito, hai incluso la macro '__OSX__' nella citazione della guida e uno potrebbe capire che è una spiegazione dalla guida collegata, ma è il tuo commento. Mi sono un po 'confuso :-) – mloskot

+2

Link non aggiornato. – Zammbi

+1

@Zammbi Link corretto. –

9

Ecco uno nice list di macro per sistemi operativi.

Ci sono piccole informazioni su __OSX__ sul web. Sarai al sicuro con __APPLE__.

+0

+1 a te e Martin York. Grazie! Tuttavia, sono ancora molto curioso di sapere da dove proviene '__OSX__', quindi aspetterò un po 'con la mia domanda come risposta. – mloskot

3

Di solito uso __MACH__ per questo. È stato definito sin dalla prima versione di OS X (e anche prima, presumibilmente).

+1

'__MACH__' è usato anche per GNU/Hurd perché quest'ultimo usa attualmente un kernel Mach. – kennytm

+0

@KennyTM - grazie per quello - non sapevo che ci fossero altri sistemi là fuori che usassero "__MACH__". Per i miei scopi è comunque abbastanza buono, dato che di solito mi interessa solo Mac OS X v Linux v Windows. –

+0

Paul, grazie per il suggerimento, è utile ma in realtà non risponde alla mia domanda iniziale. Mi piacerebbe sapere con precisione da dove proviene '__OSX__'. – mloskot