Visual Studio 2012 __cplusplus и С++ 11

Кто-нибудь знает, почему __cplusplus определяется как 199711L (который является "старым" С++) в моем проекте Visual Studio 2012 С++? Если он не говорит 201103L, так как VS 2012 теперь поддерживает С++ 11? Даже если я включаю заголовки С++ 11, это все еще неправильно определено. Любые подсказки?

Ответ 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 для реализации, хорошая реклама), и хорошо, что некоторые из них более консервативны.