2011-09-23 9 views
30

na gnu C++ wydaje określić __cplusplus być 1GNU 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?

+13

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

+0

Co powiedzie się na '#ifndef nullptr'' #define nullptr NULL' '# endif' lub' #ifdef nullptr' '#define MYNULL nullptr'' # else' '#define MYNULL NULL'' # endif' –

Odpowiedz

28

ta została ustalona około miesiąc temu (gcc 4.7.0). Raport o błędzie tworzy interesującą lekturę: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773

+0

Skąd, zaktualizowałem moje svn drzewo w zeszłym tygodniu, ale nie uruchomiłem kodu testowego * tego * kompilatora. Czekaj ... Tak, masz rację! gcc-4.7.0 z zeszłego tygodnia: './define-cplusplus.x 199711' – towi

+3

+1 dla linku do raportu o błędach. Bardzo interesujące. – Joe

+1

Błąd był otwarty przez ponad 10 lat ... Ciekawe lektura. – Richard

0

Jest to bardzo stary błąd g ++.

Oznacza to, że kompilator nie jest zgodny.

Wygląda na to, że nie można go naprawić, ponieważ naprawienie go zepsuje coś na zwariowanej platformie.

EDYTOWANIE: o, widzę z komentarza @ birryree, który został właśnie naprawiony, w wersji 4.7.0. Naprawienie nie było niemożliwe. Heh.

Pozdrawiam & hth.

0

Jeśli dobrze pamiętam, ma to związek z Solaris 8, powodując problemy, gdy __cplusplus jest ustawiony tak, jak powinien. Zespół gcc zdecydował wówczas, że będzie wspierać platformę Solaris 8, a nie będzie zgodny z tą szczególną klauzulą. Ale zauważyłem, że najnowsza wersja gcc kończy obsługę Solaris 8 i wydaje mi się, że jest to pierwszy krok we właściwym kierunku.