2011-08-28 15 views
23

Czy są jakieś wstępnie zdefiniowane makra dla C++, aby kod mógł zidentyfikować standard?C++ 11 predefiniowane makro

np. Obecnie większość kompilatorów umieszcza "tablicę" w folderze "tr1", ale w C++ 11 byłaby częścią STL. Więc obecnie

#include <tr1/array> 

ale C++ 11

#include <array> 

Co jest predefiniowane makra dla standardowych 03 i 11 w celu standardzie mogę wykorzystać #ifdef zidentyfikować?

Sądzę też, że istnieją makra dla C90 i C99?

Thanksx

+1

To ma niewiele wspólnego ze standardem, to całkowicie zależy od tego, co obsługuje Twój kompilator. Każdy kompilator wstępnie definiuje makro, które podaje jego numer wersji. Zapoznaj się z dokumentacją kompilatora. –

+0

możliwy duplikat [Ustal dostępność C++ 0x] (http: // stackoverflow.com/questions/1975616/determine-c0x-availability) –

+3

@Hans Passant: Fail. 'Nazwa _ _ cplusplus jest zdefiniowana do wartości 201103L podczas kompilowania jednostki tłumaczącej C++." (16.8 Wstępnie zdefiniowane nazwy makr). –

Odpowiedz

20

Z here

C++ 0x makro __cplusplus zostanie ustawiona na wartość, która różni się od ( jest większy niż) prądu 199711L.

Można prawdopodobnie przetestować jego wartość, aby określić, czy jest to C++ 0x lub nie wtedy

+1

Należy pamiętać, że chociaż jest to prawdopodobnie najlepsze, co można zrobić, niestety nie będzie działać dla VC++ (westchnienie). Aktualny VC++ (dla VS2010) definiuje '__cplusplus' jako 199711L, ale wciąż jest tylko' tablica' nie 'tr1/array' (ale jest zdefiniowany w przestrzeni nazw tr1) – Voo

+0

Hmm nie jest dobra. Chociaż myślę, że znaleźli się w trudnej sytuacji. Nie mogli twierdzić, że są zgodne z 0x, ponieważ implementowali tylko jego część, a standard wciąż był daleko - ale chcieli zaimplementować części, które wykonali zgodnie ze standardem ... – jcoder

+1

Należy również pamiętać, że GCC naprawiono to tak, że '__cplusplus' zgłasza coś innego niż' 1' (uwaga: nawet "199711L") kilka tygodni temu, więc nie będzie działać również dla GCC, dopóki nie skończy się 4.7.0. Ponadto, z archiwum błędów nie jest całkowicie jasne, czy będzie obsługiwać coś większego niż '199711L' off the bat dla kompilacji C++ 0x (chociaż zgaduję, że to zrobi). Zobacz http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773 - 10-letni błąd. –

1

Ostatecznie, będziesz musiał użyć kompilatora informacje specyficzne. Przynajmniej dopóki C++ 0x nie stanie się bardziej rozpowszechnione. Zasadniczo musisz wybrać wersje sterowników, które implementują coś i testują na nich makra specyficzne dla kompilatora.

Biblioteka ma wiele makr, które mogą ci pomóc.

7

przyczepić ...

Twój szczególny problem nie zależy od kompilatora, to zależy od realizacji Biblioteka standardowa.

Ponieważ możesz wybrać inną bibliotekę standardową, niż ta dostarczona przez Twój kompilator (na przykład wypróbować libC++ lub stlport), nie pomoże tutaj żadna informacja dotycząca kompilatora.

Najlepszym rozwiązaniem jest samodzielne utworzenie konkretnego pliku nagłówkowego, w którym można wybrać jeden lub drugi (w zależności od opcji kompilacji).

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

wtedy udokumentować opcję kompilatora:

Przechodząc -DSTD_HAS_TR1_ARRAY_HEADER będzie oznaczać, że std::tr1::array jest zdefiniowana w <tr1/array> zamiast domyślnego <array>.

I gotowe.

6

Od projektu 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.