Кто-нибудь знает, почему __cplusplus
определяется как 199711L
(который является "старым" С++) в моем проекте Visual Studio 2012 С++? Если он не говорит 201103L
, так как VS 2012 теперь поддерживает С++ 11? Даже если я включаю заголовки С++ 11, это все еще неправильно определено. Любые подсказки?
Visual Studio 2012 __cplusplus и С++ 11
Ответ 1
Это уже было отправлено Microsoft для просмотра:
Значение предопределенного макроса __cplusplus по-прежнему сохраняется в 199711L
Ответ 2
Это действительно зависит от того, что вы ожидаете от фактического значения макроса. Если 201103L означает "Этот компилятор полностью поддерживает все С++ 11 как в компиляторе, так и в библиотеке?" Должно ли это означать "Этот компилятор поддерживает некоторые разумные подмножества С++ 11?" Если это означает: "Этот компилятор поддерживает как минимум одну функцию С++ 11 в некотором роде, форме или форме?"
Это действительно зависит от каждой реализации, чтобы решить, когда ударить номер версии. Visual Studio отличается от Clang и GCC, поскольку он не имеет отдельного режима компиляции С++ 03; он предоставляет определенный набор функций и то, что он предоставляет.
В общем, один макрос не является полезным инструментом, чтобы решить, когда использовать какую-либо функцию. Boost.Config - гораздо более надежный механизм. Комитет по стандартам исследует способы решения этой проблемы в будущих версиях стандарта.
Ответ 3
Я с Николом на этом. Единственная причина для тестирования __cplusplus >= 201103L
- проверить, можете ли вы использовать новые функции. Если компилятор реализует только половину новых функций, но использует новое значение __cplusplus
, он не сможет скомпилировать много допустимого кода С++ 11, защищенного __cplusplus >= 201103L
(у меня есть некоторые, которые используют thread_local
и *this
ссылки). Если, с другой стороны, он сохраняет 199711L
, он будет использовать безопасный код С++ 98, который по-прежнему прекрасен. Возможно, это может пропустить несколько оптимизаций, но вы можете использовать другие способы, чтобы определить, доступна ли какая-либо конкретная функция (версия компилятора, макросы, специфичные для компилятора, такие как __GXX_EXPERIMENTAL_CXX0X__
, макросы повышения, которые проверяют макросы компилятора для вас и т.д.). Важным является безопасное по умолчанию.
Есть две возможные причины перехода на новое значение __cplusplus:
- ваш компилятор имеет полную поддержку для С++ 11 (или достаточно близко, всегда будут ошибки)
- Это экспериментальный режим вашего компилятора, который не следует использовать в процессе производства, и то, что обычно будет отсутствовать, будет считаться ошибкой.
Насколько я знаю, все компиляторы, которые переключились, находятся во второй категории.
Я считаю, что некоторые производители компиляторов слишком увлечены изменением ценности __cplusplus (самая простая функция С++ 11 для реализации, хорошая реклама), и хорошо, что некоторые из них более консервативны.