2011-08-28 31 views
23

¿Existen macros predefinidas para C++ para que el código pueda identificar el estándar?C++ 11 macro predefinida

p. Ej. Actualmente la mayoría de los compiladores ponen "matriz" en la carpeta "tr1" pero para C++ 11 sería parte de STL. Así Actualmente

#include <tr1/array> 

pero C++ 11

#include <array> 

¿Cuál es las macros predefinidas para 03 estándar y 11 estándar con el fin puedo usar para identificar #ifdef?

Además, supongo que hay macros para C90 y C99?

Thanksx

+1

tiene poco que ver con el estándar, depende totalmente de la que admite el compilador. Cualquier compilador predefine una macro que da su número de versión. Consulte su documentación del compilador. –

+0

posible duplicado de [Determinar la disponibilidad de C++ 0x] (http: // stackoverflow.com/questions/1975616/determine-c0x-availability) –

+3

@Hans Passant: Fail. 'El nombre _ _ cplusplus se define con el valor 201103L al compilar una unidad de traducción C++. (16.8 nombres de macro predefinidos). –

Respuesta

20

De here

En C++ 0x la __cplusplus macro se establece en un valor que difiere a partir de (es mayor que) el 199711L actual.

es probable que pueda probar su valor para determinar si se trata de C++ 0x o no, entonces

+1

Tenga en cuenta que aunque esto es probablemente lo mejor que puede hacer, lamentablemente no funcionará para VC++ (suspiro). El actual VC++ (para VS2010) define '__cplusplus' como 199711L pero todavía hay' array' no 'tr1/array' (pero está definido con un espacio de nombres tr1) – Voo

+0

Hmm no es bueno. Aunque supongo que estaban en una posición difícil. No podían afirmar que cumplían con 0x porque solo implementaron parte de él, y el estándar todavía estaba lejos de todos modos, pero querían implementar las partes que habían hecho de conformidad con el estándar ... – jcoder

+1

Tenga en cuenta también que GCC lo arregló para que '__cplusplus' reporte algo que no sea' 1' (nota: ni siquiera '199711L') hace solo un par de semanas, por lo que tampoco funcionará para GCC hasta que no haya 4.7.0. Además, no está del todo claro desde el archivo de errores si va a admitir algo más que '199711L' de la noche a la mañana para C++ 0x compilaciones (aunque supongo que sí). Vea http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773 - un error de más de 10 años. –

1

En última instancia, usted va a tener que utilizar la información compilador específico. Al menos, hasta que C++ 0x se implemente más ampliamente. Básicamente necesita elegir versiones de controladores que implementen algo y probar macros específicas del compilador.

La biblioteca Boost.Config tiene una serie de macros que pueden ayudarlo.

7

nitpick ...

Su tema en particular no depende de su compilador, que depende de la implementación de la biblioteca estándar.

Como puede elegir una biblioteca estándar distinta de la proporcionada por su compilador (por ejemplo, probando libC++ o stlport), no hay información específica del compilador que lo ayude aquí.

Por lo tanto, la mejor opción es crear un archivo de encabezado específico, en el que elegirá uno u otro (según una opción de compilación).

// array.hpp 
#ifdef STD_HAS_TR1_ARRAY_HEADER 
#include <tr1/array> 
#else 
#include <array> 
#endif 

A continuación documentan la opción de compilador:

Pasando -DSTD_HAS_TR1_ARRAY_HEADER significará que std::tr1::array se define en <tr1/array> en lugar del predeterminado <array>.

Y listo.

6

Desde el proyecto N3242:

16.8 Predefined macro names       [cpp.predefined] 
... 
    The name _ _ cplusplus is defined to the value 201103L when 
    compiling a C++ translation unit. 155) 
... 
155) It is intended that future versions of this standard will 
    replace the value of this macro with a greater value. 
    Non-conforming compilers should use a value with at most five 
    decimal digits.