2011-09-23 18 views
30

Gnu C++ compilatore sembra definire __cplusplus essere 1La macro di Gnu C++ è conforme allo standard __cplusplus?

#include <iostream> 
int main() { 
    std::cout << __cplusplus << std::endl; 
} 

Questo stampa 1 con gcc nello standard C++ modo, così come nella modalità 0x C++, con gcc 4.3.4 e gcc 4.7.0.

Il C++ 11 FDIS dice nel "16,8 predefiniti nomi di macro [cpp.predefined]" che

Il nome __cplusplus è definito al valore 201103Ldurante la compilazione di un'unità di traduzione C++. (Nota: Si prevede che le future versioni di questo standard sostituiranno il valore di questa macro con un valore maggiore non conformi com- pilers dovrebbe utilizzare un valore con al più cinque cifre decimali..)

Il il vecchio std C++ 03 aveva una regola simile.

Il GCC lo ha impostato deliberatamente su 1, perché è "non conforme"?

Leggendo questa lista ho pensato che potrei usare __cplusplus per controllare in modo portabile se ho un compilatore abilitato per C++ 11. Ma con g ++ questo non sembra funzionare. Conosco la macro ...EXPERIMENTAL..., ma mi chiedo perché il g ++ stia definendo __cplusplus in questo modo.

Il mio problema originale era passare da diverse varianti di null-pointer. Qualcosa di simile a questo:

#if __cplusplus > 201100L 
# define MYNULL nullptr 
#else 
# define MYNULL NULL 
#endif 

C'è un modo semplice e ragionevolmente portatile per implementare tale cambiamento?

+13

Nota a margine: non ho letto completamente questo thread, ma questo è stato riconosciuto come un bug in g ++ (10 anni fa!) ed è stato risolto in 4.7.0: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773 – birryree

+0

Come dire '#ifndef nullptr'' #define nullptr NULL' '# endif' o' #ifdef nullptr '' #define MYNULL nullptr' '# else'' #define MYNULL NULL' '# endif' –

risposta

28

Questo problema è stato risolto circa un mese fa (per gcc 4.7.0). Il bug report rende interessante una lettura: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773

+0

Whow, ho aggiornato il mio albero svn la settimana scorsa, ma non ho eseguito il codice di test su * that * compiler. Aspetta ... Sì, hai ragione! gcc-4.7.0 della scorsa settimana: './define-cplusplus.x 199711' – towi

+3

+1 per il collegamento del bug report. Molto interessante. – Joe

+1

Il bug era aperto da oltre 10 anni ... Interessante da leggere davvero. – Richard

0

È un bug g ++ molto vecchio.

Cioè, il compilatore non è conforme.

Apparentemente non può essere risolto perché il suo fissaggio spezzerebbe qualcosa su una piattaforma pazza.

EDIT: oh, vedo dal commento di @ birryree che è stato appena risolto, nella versione 4.7.0. Quindi, non era impossibile da risolvere, dopo tutto. Eh.

Cheers & hth.

0

Se ricordo correttamente questo ha a che fare con Solaris 8 causando problemi quando __cplusplus è impostato come dovrebbe. Il team di gcc ha deciso al momento di supportare la piattaforma Solaris 8 anziché essere conforme a questa particolare clausola. Ma ho notato che l'ultima versione di gcc termina il supporto di Solaris 8 e immagino che questo sia un primo passo nella giusta direzione.

Problemi correlati