Gnu C++ compilatore sembra definire __cplusplus
essere 1
La 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?
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
Come dire '#ifndef nullptr'' #define nullptr NULL' '# endif' o' #ifdef nullptr '' #define MYNULL nullptr' '# else'' #define MYNULL NULL' '# endif' –