2011-08-28 26 views
23

Esistono macro predefinite per C++ in modo che il codice possa identificare lo standard?Macro predefinita C++ 11

ad es. Attualmente la maggior parte dei compilatori mette "array" nella cartella "tr1" ma per C++ 11 sarebbe parte di STL. Quindi attualmente

#include <tr1/array> 

ma C++ 11

#include <array> 

Qual è il macro predefinite per 03 serie e 11 di serie al fine posso usare #ifdef per identificare?

Inoltre, suppongo che ci siano macro per C90 e C99?

Thanksx

+1

Ha poco a che fare con lo standard, completamente dipende da quello che sostiene il vostro compilatore. Qualsiasi compilatore predefinisce una macro che fornisce il suo numero di versione. Consulta la documentazione del compilatore. –

+0

possibile duplicato di [Determina disponibilità C++ 0x] (http: // stackoverflow.it/questions/1975616/define-c0x-availability) –

+3

@Hans Passant: Fail. 'Il nome _ _ cplusplus è definito sul valore 201103L durante la compilazione di un'unità di traduzione C++. (16.8 Nomi macro predefiniti). –

risposta

20

Da here

In C++ 0x la __cplusplus macro viene impostato su un valore diverso da (è maggiore) il 199711L corrente.

Si può probabilmente provare il suo valore per determinare se si tratta di C++ 0x o no, allora

+1

Nota che anche se questo è probabilmente il meglio che puoi fare, purtroppo non funzionerà con VC++ (sigh). L'attuale VC++ (per VS2010) definisce '__cplusplus' come 199711L ma c'è ancora solo' array' no 'tr1/array' (ma è definito con un namespace tr1) – Voo

+0

Hmm non buono. Anche se immagino fossero in una posizione difficile. Non potevano pretendere di essere compatibili con 0x perché ne hanno implementato solo una parte, e lo standard era ancora molto lontano comunque - ma volevano implementare le parti che avevano fatto in conformità con lo standard ... – jcoder

+1

Nota anche che GCC corretto così '__cplusplus' riporta qualcosa di diverso da' 1' (nota: nemmeno '199711L') solo un paio di settimane fa, quindi non funzionerà neanche per GCC fino a che 4.7.0 non sarà disponibile. Inoltre, non è del tutto chiaro dall'archivio bug se supporterà qualcosa di più grande di '199711L' di pip per build C++ 0x (anche se suppongo che lo farà). Vedi http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773 - un bug di 10 + anni. –

1

In ultima analisi, si sta andando ad avere per utilizzare le informazioni specifiche del compilatore. Almeno, fino a quando C++ 0x diventa più ampiamente implementato. Fondamentalmente è necessario selezionare versioni di driver che implementino qualcosa e testare macro specifiche del compilatore su di esse.

La libreria Boost.Config ha un numero di macro che può essere d'aiuto.

7

Nitpick ...

tuo problema particolare non dipende dal compilatore, esso dipende dall'implementazione libreria standard.

Dato che sei libero di scegliere una libreria standard diversa da quella fornita dal tuo compilatore (ad esempio, provando libC++ o stlport), nessuna quantità di informazioni specifiche sul compilatore ti aiuterà qui.

La soluzione migliore è quindi creare da soli uno specifico file di intestazione, in cui scegliere l'uno o l'altro (in base all'opzione di compilazione).

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

È quindi documentare l'opzione del compilatore:

Passando -DSTD_HAS_TR1_ARRAY_HEADER significherà che std::tr1::array è definito in <tr1/array> al posto del default <array>.

E il gioco è fatto.

6

Dal progetto 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.