__cplusplus
powinna być zdefiniowana jako 199711L
w ampułko-C++ 11 kompilatorów, 201103L
w tych Działalność na rzecz C++ 11. Czy jest to znacznie pomocne w praktyce, to kolejne pytanie: większość kompilatorów jest tylko w połowie drogi, więc nie powinno go definiować jako 201103L
, nawet jeśli wspierają one funkcje, którymi jesteś zainteresowany. I nie jest to niespotykane, żeby kompilator kłamał: kompilator, który definiuje go jako 199711L
i nie obsługuje na przykład export
dla szablonów. Ale nie ma standardowej funkcji według testu funkcji.
Najprostszym rozwiązaniem jest po prostu nie używać żadnej konkretnej nowej funkcji, dopóki nie będziesz mieć pewności, że wszystkie kompilatory ją obsługują. W każdym razie musisz napisać i wesprzeć kod awaryjny; po co utrzymywać dwie wersje. Jedynym wyjątkiem od tej reguły mogą być nowe funkcje, które mają wpływ na wydajność: czy kompilator obsługuje semantykę ruchu, czy nie. W takich przypadkach proponuję plik zależny od kompilatora, który sam napiszesz na podstawie dokumentacji kompilatora i testów osobistych; tylko dlatego, że kompilator może udokumentować, że obsługuje określoną funkcję, nie oznacza, że jego obsługa jest wolna od błędów. Po prostu utwórz katalog na docelowy kompilator, umieść tam ten plik i określ właściwą opcję -I
lub /I
w pliku makefile lub projekcie.
A twoje testy powinny być coś wzdłuż linii:
#ifdef HAS_MOVE_SEMANTICS
...
#endif
zamiast tylko na wersji kompilatora, czy cokolwiek innego.
Problem polega na tym, że GCC nie obsługuje jeszcze w pełni C++ 11, więc to naprawdę zależy od funkcji, których chcesz użyć. – juanchopanza
przyspieszy pracę: http://www.boost.org/doc/libs/1_49_0/libs/config/doc/html/boost_config/boost_macro_reference.html#boost_config.boost_macro_reference.macros_that_describe_c__11_features_not_supported? – rve
@rve: Dlaczego nie zamieściłeś go jako odpowiedzi? To jest dobre. –