Visual Studio 2012 __cplusplus y C ++ 11

Alguien sabe por qué __cplusplus se define como 199711L (que es el “viejo” C ++) en mi proyecto Visual Studio 2012 c ++? ¿No 201103L decir 201103L ya que VS 2012 ahora tiene compatibilidad con C ++ 11? Incluso si incluyo encabezados C ++ 11, aún está mal definido. ¿Alguna pista?

Esto ya se ha enviado a Microsoft para su revisión:

Un valor de macro predefinido __cplusplus sigue siendo 199711L

Realmente depende de lo que esperas que esa macro realmente signifique. ¿Debería 201103L decir “Este comstackdor es totalmente compatible con C ++ 11 tanto en el comstackdor como en la biblioteca?” ¿Debería significar “Este comstackdor admite algún subconjunto razonable de C ++ 11?” ¿Debería significar que “este comstackdor admite al menos una característica de C ++ 11 de alguna manera, forma o forma?”

Depende de cada implementación decidir cuándo encontrar el número de versión. Visual Studio es diferente de Clang y GCC, ya que no tiene un modo de comstackción C ++ 03 por separado; proporciona un conjunto específico de características, y eso es lo que proporciona.

En general, una sola macro no es una herramienta útil para decidir cuándo usar alguna función. Boost.Config es un mecanismo mucho más confiable. El comité de estándares está investigando formas de lidiar con este problema en futuras versiones del estándar.

Estoy con Nicol en este. La única razón para probar __cplusplus >= 201103L es verificar si puede usar las nuevas características. Si un comstackdor implementa solo la mitad de las nuevas características pero usa el nuevo valor de __cplusplus , no podrá comstackr una gran cantidad de código válido de C ++ 11 protegido por __cplusplus >= 201103L (tengo algunos que usan thread_local y *this referencias) . Si, por otro lado, conserva 199711L , usará el código seguro C ++ 98, que todavía está bien. Puede perder algunas optimizaciones de esa manera, pero aún puede usar otras formas para detectar si una característica específica está disponible (versión de comstackción, macros específicos del comstackdor como __GXX_EXPERIMENTAL_CXX0X__ , impulsar macros que comprueban las macros del comstackdor, etc.). Lo que importa es un incumplimiento seguro.

Hay 2 posibles razones para cambiar al nuevo valor de __cplusplus:

  • su comstackdor tiene soporte completo para C ++ 11 (o lo suficientemente cerca, siempre habrá errores)
  • este es un modo experimental de su comstackdor que no debe usarse en producción, y lo que normalmente serían características que faltan cuentan como errores.

Hasta donde yo sé, todos los comstackdores que han cambiado están en la segunda categoría.

Creo que algunos proveedores de comstackdores han sido demasiado entusiastas acerca de cambiar el valor de __cplusplus (la característica más fácil de C ++ 11 para implementar, buena publicidad), y es bueno que algunos sean más conservadores.

A partir de abril de 2018, MSVC 2017 ahora correctamente informa la macro, pero solo si se utiliza un interruptor específico (/ Zc: __ cplusplus). Esto se debe a que una gran cantidad de código antiguo se basa en la detección del antiguo valor de la macro para los comstackdores de MSVC. Fuente: https://blogs.msdn.microsoft.com/vcblog/2018/04/09/msvc-now-correctly-reports-__cplusplus/

Esperemos que en el futuro, una vez que las personas de todo el mundo hayan actualizado su código, MS informe la macro correctamente de forma predeterminada.