Ya no tienes que indagar más por todo internet porque estás al sitio exacto, contamos con la respuesta que deseas y sin complicaciones.
Solución:
Esto se explica en profundidad en el manual de gcc, disponible (si está instalado) escribiendo info gcc
o en línea aquí. La sección relevante del manual 4.7.2 está aquí.
De forma predeterminada, gcc no cumple con ninguno de los estándares ANSI / ISO C. El valor predeterminado actual es equivalente a -std=gnu90
, que es el estándar 1989/1990 con extensiones específicas de GNU. (No se emiten algunos diagnósticos requeridos por el estándar de idioma). La versión 5.1.0, publicada el 22 de abril de 2015, cambió el valor predeterminado de -std=gnu90
para -std=gnu11
, como se documenta aquí.
Si desea una conformidad estándar, puede utilizar cualquiera de los siguientes:
-std=c90 -pedantic
-std=c99 -pedantic
-std=c11 -pedantic
-std=c90
también se puede escribir -ansi
, -std=c89
, o -std=iso9899:1990
.
-std=iso9899:199409
admite el estándar C90 más la enmienda de 1995, que agregó algunas características menores (todas las cuales también están en C99).
-std=c99
también se puede escribir -std=c9x
o -std=iso9899:1999
(el nombre c9x
se utilizó antes de que se publicara el estándar). El soporte de C99 no es del todo completo, pero está cerca.
-std=c11
también se puede escribir -std=c0x
o -std=iso9899:2011
(el nombre c0x
se utilizó antes de que se publicara la norma final; se asumió erróneamente que x
no excedería de 9). El soporte de C11 también es incompleto; el estado actual se resume aquí.
los -pedantic
La opción hace que gcc imprima los diagnósticos necesarios para violaciones de restricciones y reglas de sintaxis. En algunos casos, esos diagnósticos son simplemente advertencias, y no hay una manera fácil de distinguir entre esas advertencias y otras advertencias que no son requeridas por el idioma. Reemplazar -pedantic
por -pedantic-errors
para hacer que gcc trate las violaciones del lenguaje como errores fatales.
Una historia rápida del estándar:
- C89 fue el primer estándar C oficial, publicado por ANSI en 1989.
- C90 era la versión ISO del estándar y describía exactamente el mismo lenguaje que C89. ANSI adoptó oficialmente la versión ISO del estándar. Hubo dos Correcciones Técnicas, corrigiendo algunos errores.
- C95 fue una enmienda a C90, agregando algunas características, principalmente dígrafos y amplio soporte de caracteres. Hasta donde yo sé, nunca se publicó una versión fusionada.
- ISO emitió el C99 en 1999. Había tres correcciones técnicas.
- C11 fue emitido por ISO en 2011. Ha habido un Corrigendum Técnico, fijando las definiciones de
__STDC_VERSION__
y__STDC_LIB_EXT1__
.
ANSI no emitió sus propias versiones de las normas de 1999 o 2011, sino que adoptó las normas ISO.
N1256 es un borrador disponible de forma gratuita del estándar C99, con las 3 correcciones técnicas fusionadas en él.
N1570 es un borrador disponible gratuitamente del estándar C11. Existen algunas diferencias menores entre este y el estándar C11 publicado, más un Corrigendum técnico. Para obtener más detalles, consulte mi respuesta a esta pregunta.
información útil de info gcc
para gcc6 y https://gcc.gnu.org/onlinedocs/gcc-5.4.0/gcc/Standards.html#Standards para gcc5
versión gcc 6.3.1
– 10.1.0
2.1 C Language
==============
The default, if no C language dialect options are given, is
'-std=gnu11'.
2.2 C++ Language
================
The default, if no C++ language dialect options are given, is
'-std=gnu++14'.
versión gcc 5.4.0
2.1 C Language
==============
The default, if no C language dialect options are given, is -std=gnu11
2.2 C++ Language
================
The default, if no C++ language dialect options are given, is -std=gnu++98
Para C, el modo predeterminado permanece std=gnu11
, pero para C ++ ha saltado de std=gnu++98
para std=gnu++14
Programa de prueba mínimo
Si te apetece descubrirlo empíricamente sin leer ningún manual.
cc
#include
int main(void)
#ifdef __STDC_VERSION__
printf("__STDC_VERSION__ = %ld n", __STDC_VERSION__);
#endif
#ifdef __STRICT_ANSI__
puts("__STRICT_ANSI__");
#endif
return 0;
Prueba con:
#!/usr/bin/env bash
for std in c89 c99 c11 c17 gnu89 gnu99 gnu11 gnu17; do
echo $std
gcc -std=$std -o c.out c.c
./c.out
echo
done
echo default
gcc -o c.out c.c
./c.out
Salir:
c89
__STRICT_ANSI__
c99
__STDC_VERSION__ = 199901
__STRICT_ANSI__
c11
__STDC_VERSION__ = 201112
__STRICT_ANSI__
c17
__STDC_VERSION__ = 201710
__STRICT_ANSI__
gnu89
gnu99
__STDC_VERSION__ = 199901
gnu11
__STDC_VERSION__ = 201112
gnu17
__STDC_VERSION__ = 201710
default
__STDC_VERSION__ = 201710
Conclusión: gnu17
se utiliza por defecto:
__STRICT_ANSI__
: Extensión GCC definida para-std=c
pero no para-std=gnu
, ver: https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html__STDC_VERSION__
: C99 + ANSI C macro que se establece para cada versión. No está presente en C89 donde aún no estaba definido por la norma.
Para una explicación de -std=gnu*
vs -std=c*
ver también: ¿Cuáles son las diferencias entre -std = c ++ 11 y -std = gnu ++ 11?
C ++
main.cpp
#include
int main(void)
#ifdef __cplusplus
std::cout << __cplusplus << std::endl;
#endif
#ifdef __STRICT_ANSI__
std::cout << "__STRICT_ANSI__" << std::endl;
#endif
return 0;
Prueba con:
#!/usr/bin/env bash
for std in c++98 c++11 c++14 c++17 gnu++98 gnu++11 gnu++14 gnu++17; do
echo $std
g++ -std=$std -o cpp.out cpp.cpp
./cpp.out
echo
done
echo default
g++ -o cpp.out cpp.cpp
./cpp.out
Salir:
c++98
199711
__STRICT_ANSI__
c++11
201103
__STRICT_ANSI__
c++14
201402
__STRICT_ANSI__
c++17
201703
__STRICT_ANSI__
gnu++98
199711
gnu++11
201103
gnu++14
201402
gnu++17
201703
default
201402
Conclusión: gnu++14
es el predeterminado:
__cplusplus
: macro definido por el estándar C ++ incluso en C ++ 98 en adelante
Probado en Ubuntu 18.10, GCC 8.2.0. GitHub en sentido ascendente.
No se te olvide recomendar esta noticia si si solucionó tu problema.