Ответ 1
__cplusplus
должен быть определен как 199711L
в компиляторах pre-С++ 11, 201103L
в тех, кто поддерживает С++ 11. На практике это другой вопрос: большинство компиляторов только на полпути, поэтому не следует определять его как 201103L
, даже если они поддерживают функции, которые вас интересуют. И это не неслыханно для компилятора для lie: компилятор, который определяет его как 199711L
и не поддерживает export
для шаблонов, например. Но функциональная проверка не существует.
Самое простое решение - просто не использовать какую-либо конкретную новую функцию, пока не убедитесь, что все ее компиляторы поддерживают ее. Вы все равно должны писать и поддерживать резервный код; зачем поддерживать две версии. Единственным исключением из этого правила могут быть новые функции, которые влияют на производительность: поддерживает ли компилятор семантику переноса или нет. В таких случаях я бы предложил включить зависимый от компилятора файл, который вы пишете на основе документации компилятора и личных тестов; просто потому, что компилятор может документировать, что он поддерживает определенную функцию, не означает, что его поддержка не является ошибкой. Просто создайте каталог для каждого целевого компилятора, поместите туда этот файл и укажите подходящую опцию -I
или /I
в файле makefile или файла проекта.
И ваши тесты должны быть чем-то вроде:
#ifdef HAS_MOVE_SEMANTICS
...
#endif
а не только на компилятор, версию или что-то еще.