2009-07-13 14 views
6

Estoy escribiendo una pequeña biblioteca en C++ que necesito para poder compilar en bastantes plataformas diferentes, incluyendo iPhone, Windows, Linux, Mac y Symbian S60. He escrito la mayor parte del código para que sea independiente de la plataforma, pero hay algunas partes que deben escribirse por plataforma.Definiciones de preprocesador de plataforma C

Actualmente lo logro incluyendo un encabezado diferente en función de la plataforma actual, pero tengo problemas para completar esto porque no estoy seguro de qué definiciones de preprocesador se definen para todas las plataformas. Para Windows generalmente puedo confiar en ver WIN32 o _WIN32. Para Linux puedo confiar en que vea _UNIX_ pero estoy menos seguro acerca de las otras plataformas o sus variantes de 64 bits. ¿Alguien tiene una lista de las diferentes definiciones encontradas en las plataformas o tendré que recurrir a un archivo de configuración o al parámetro gcc?

Respuesta

9

Tengo this sourceforge pre-compiler página en mis marcadores.

+0

Le he editado el enlace para que apunte a la nueva versión wiki -ized, que es mucho más actualizada, aunque Google siempre apunta a la versión anterior . – rubenvb

+0

Eso está bien, gracias. –

0

Ni los estándares C ni C++ definen tales símbolos, por lo que estará a merced de implementaciones C o C++ específicas. Sería útil tener una lista de símbolos comúnmente utilizados, pero desafortunadamente no tengo ninguno.

0

No creo que exista una lista universal de plataformas a juzgar por el hecho de que cada biblioteca multiplataforma que he visto tiene una configuración ad-hoc llena de estas cosas. Pero se puede considerar la búsqueda de los utilizados por las bibliotecas bastante portátil como libpng, etc. zlib

Aquí está el utilizado por libpng

0

Las definiciones van a ser puramente hasta el proveedor del compilador. Si está utilizando el mismo compilador (por ejemplo, gcc) en todas sus plataformas, entonces tendrá un poco más de tiempo.

En su lugar, puede intentar organizar su proyecto de modo que la mayoría de los archivos .h no dependan de la plataforma. Divida su implementación (archivos cpp) en archivos separados; uno para las cosas no específicas y otro para cada plataforma. Los específicos de la plataforma pueden incluir encabezados 'privados' que solo tienen sentido para esa plataforma. Puede que tenga que hacer funciones de adaptador para hacer que algo como esto funcione al 100% (cuando las libs del sistema toman argumentos ligeramente diferentes) pero al final he encontrado que es realmente útil, y traer una nueva plataforma es mucho más fácil en el futuro.

0

Si quiere mirar a través de los símbolos del preprocesador por defecto para un determinado sistema en el que haya GCC (por ejemplo, Mac OS X, iOS, Linux), se puede obtener una lista completa de la línea de comandos así:

echo 'main(){}' | cpp -dM 

Estos son a menudo de uso limitado sin embargo, como en la etapa de la compilación a la que funciona el preprocesador, la mayor parte de los símbolos identificar el sistema operativo y el tipo de CPU de sólo el sistema alojamiento el compilador, en lugar del sistema siendo el objetivo (por ejemplo, cuando se compila de forma cruzada para iOS). En Mac OS X y iOS, de la manera correcta para determinar las características de tiempo de compilación del sistema que está siendo apuntado es

#include <TargetConditionals.h> 

Este recogerá TargetConditionals.h de la plataforma y SDK actualmente en uso, y luego se puede determinar (por ejemplo) endianness y algunas otras características de algunas de las macros. (Mire a través de TargetConditionals.h para ver qué tipo de información puede recopilar.)

+0

Aunque comprobar -dM output podría ayudar, no puede garantizar tanta información como la página wiki predef sourceforge. – rubenvb