na gnu C++ wydaje określić __cplusplus
być 1
GNU C++ odpowiadać?
#include <iostream>
int main() {
std::cout << __cplusplus << std::endl;
}
drukuje 1
z gcc w standardowym trybie C++, jak również tryb C++ 0x z gcc 4.3.4 i GCC 4.7.0.
C++ 11 FDIS mówi w "16,8 predefiniowanych nazw makr [cpp.predefined]" że
Nazwa
__cplusplus
definiuje wartości 201103L podczas kompilacji C++ jednostki translacji. (Przypis: Przewiduje się, że przyszłe wersje tego standardu zastąpi wartość tego makra o większej wartości niezgodnych kom- Pilers należy użyć wartości z maksymalnie pięciu cyfr po przecinku..)
stary std C++ 03 miał podobną regułę.
Czy GCC celowo ustawia tę wartość na 1
, ponieważ jest "niezgodna"?
Czytając tę listę, pomyślałem, że mogę użyć funkcji __cplusplus
, aby sprawdzić, czy mam przenośny kompilator C++ 11. Ale z g ++ to nie wydają się działać. Wiem o ...EXPERIMENTAL...
makro, ale dostałem ciekawy dlaczego g ++ jest zdefiniowanie __cplusplus
ten sposób.
Mój pierwotny problem polegał na zmianie różnych wariantów zerowych. Coś takiego:
#if __cplusplus > 201100L
# define MYNULL nullptr
#else
# define MYNULL NULL
#endif
Czy istnieje prosty i racjonalnie przenośny sposobem wdrożenia takiej zmiany?
Nota boczna: Nie czytałem tego wątku w całości, ale został on uznany za błąd w g ++ (10 lat temu!) i jest poprawiony w 4.7.0: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773 – birryree
Co powiedzie się na '#ifndef nullptr'' #define nullptr NULL' '# endif' lub' #ifdef nullptr' '#define MYNULL nullptr'' # else' '#define MYNULL NULL'' # endif' –