2011-08-15 12 views
8

Ho notato che in MacOS X (Lion), la macro __unix__ non è definita. Poiché MacOS ha le sue radici in BSD UNIX, non dovrebbe essere così?Macro `__unix__` non definita in MacOS X

È possibile consentire al compilatore/preprocessore di sapere che voglio essere considerato un sistema UNIX?

+0

si potrebbe avere più fortuna con le macro POSIX invece http://sourceforge.net/apps/mediawiki/predef /index.php?title=Standards#Unix_Standards – Flexo

risposta

10

Il predefined macros site suggerisce usando:

#if defined(unix) || defined(__unix__) || defined(__unix) 
# define PREDEF_PLATFORM_UNIX 
#endif 

Per distinguere sistemi UNIX. Hanno anche note di avvertimento su un certo numero di compilatori che non impostano nessuno di questi. A seconda del motivo per cui ti preoccupi di cosa sia la piattaforma, potresti stare meglio guardando il tempo di configurazione (nello configure.ac o in qualsiasi altro sistema di generazione che stai utilizzando).

+5

./configure non è universale. Di fatto, è usato principalmente nelle piattaforme Unix e Unix. Usarlo per rilevare piattaforme "Unix" non mi suona bene. –

+0

È universale se scrivi la tua proprietà. Puoi scrivere il tuo, o un componente equivalente per quasi tutti i sistemi di build che contano. In CMake si scrive un test in CMakeLists.txt, negli autotools si scrive test in configure.ac, nella form si può fare simili all'interno del proprio XML. Anche Scons ha un concetto simile, credo, così come le distutils di Python. – Flexo

+1

Su Windows, non hai Bash installato per impostazione predefinita, e come puoi ./configure? Il mio altro punto era che ./configure è fondamentalmente Unixy all'inizio: usarlo per rilevare Unix è come rincorrere la coda. –

7

Penso che this site dia la risposta più completa.

Insomma, per includere le piattaforme Apple e piattaforme comuni Unix, avrete bisogno di:

#if defined(__unix__) || defined(__unix) || \ 
     (defined(__APPLE__) && defined(__MACH__)) 
... 
#endif 
Problemi correlati