2010-04-02 11 views

Respuesta

87

La próxima vez que desee comprobar las macros predefinidas compatibles con GCC en una plataforma, ejecute el preprocesador con el indicador -dM. Enumerará todas las macros predefinidas disponibles en el sistema. Por ejemplo:

$ 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 ¡Funciona como un encanto! ¡Cómo no puedo saber esto! ¡Gracias! – Viet

+1

@Viet: De nada ... de hecho me encontré con un enigma similar al tuyo recientemente. Quería saber si había una macro predefinida que indica el orden de bytes de la máquina. ¡Incurrí en esto en alguna documentación oscura después de horas y horas de búsqueda! – themoondothshine

+38

cpp -dM/dev/null también funciona, no se necesitan archivos adicionales. – Barry

11

Estaría más inclinado a probar la disponibilidad de funciones que el nombre de la plataforma. Intenta usar autoconf.

De lo contrario, esto es a comprehensive list of platform defines.

También check out this page para define con respecto a compiladores, bibliotecas, arquitecturas y dispositivos.

+1

Gracias pero evito el autoconf. Solo quiero usar macros simples. – Viet

+1

+1 para el enlace "predef". – noamtm

+0

+1 para el enlace "predef". Hay mucho más que define un nivel más alto en la wiki. Déjame mejorar tu respuesta. – Mecki

4

Utilizo __MACH__ para probar para Mac OS X - no es 100% exclusivo de Mac OS X (aún puede haber algunas cajas NeXT viejas por ahí!) Pero es lo suficientemente bueno para diferenciar entre Mac y Linux.

+0

__APPLE__ cubre Mac OS X e iOS, por lo que es una mejor apuesta que __MACH__ en mi humilde opinión. También es más común desde mi experiencia –

+0

@ Hans-ChristophSteiner APPLE NO está definido en OS X, se ve. – lang2

+0

Supongo que @Hans significa '__APPLE__'? Pero incluso entonces, no estoy seguro de que sea 100% confiable. –

8

Detecta OSX con la macro __APPLE__ si es necesario. Es mejor usar configure para detectar funciones si puede, pero no todo funciona bien de esa manera.

+0

Sí, elegí esta forma en mi código. Solo tengo Linux y Apple, así que no hay problemas. Gracias. – Viet

+2

Me resulta muy útil utilizar macros definidas por el compilador como '__APPLE__' porque puede desacoplar el código del sistema de compilación, muchas veces. Entonces te facilita mucho más cuando tratas a plataformas esotéricas como Android o Chrome NaCl, que no necesariamente funcionan bien con './Configure' y amigos –

+0

@ Hans-Christoph: Un buen entorno de compilación cruzada debería ayudar. –

Cuestiones relacionadas