Saltar al contenido

¿Cuál es la versión estándar predeterminada de C -std para el GCC actual (especialmente en Ubuntu)?

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.110.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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *