web-dev-qa-db-fra.com

Quel est le mode C par défaut pour le gcc actuel (en particulier sur Ubuntu)?

Lorsque je demande à voir la version actuelle de cc, j'obtiens ceci.

$ cc --version
cc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ 

Ce que j'aimerais savoir, c'est lequel des c89, c90, c99 ou c11 est utilisé.

49
ncmathsadist

Ceci est expliqué en détail dans le manuel de gcc, disponible (s'il est installé) en tapant info gcc ou en ligne ici . La section pertinente du manuel 4.7.2 est ici .

Par défaut, gcc n'est conforme à aucune des normes ANSI/ISO C. La valeur par défaut actuelle est équivalente à -std=gnu90, qui est la norme 1989/1990 avec des extensions spécifiques à GNU. (Certains diagnostics requis par la norme de langue ne sont pas émis.) La version 5.1.0, publiée le 2015-04-22, a changé la valeur par défaut de -std=gnu90 à -std=gnu11, comme documenté ici .

Si vous souhaitez une conformité standard, vous pouvez utiliser l'une des options suivantes:

-std=c90 -pedantic
-std=c99 -pedantic
-std=c11 -pedantic

-std=c90 peut également être orthographié -ansi, -std=c89, ou -std=iso9899:1990.

-std=iso9899:199409 prend en charge la norme C90 plus l'amendement de 1995, qui a ajouté quelques fonctionnalités mineures (qui sont toutes également en C99).

-std=c99 peut également être orthographié -std=c9x ou -std=iso9899:1999 (le nom c9x a été utilisé avant la publication de la norme). Le support C99 est pas tout à fait complet , mais il est proche.

-std=c11 peut également être orthographié -std=c0x ou -std=iso9899:2011 (le nom c0x a été utilisé avant la publication de la norme finale; on a supposé à tort que x ne dépasserait pas 9). Le support C11 est également incomplet; l'état actuel est résumé ici .

Le -pedantic option oblige gcc à imprimer les diagnostics requis pour les violations des contraintes et des règles de syntaxe. Dans certains cas, ces diagnostics ne sont que des avertissements - et il n'y a pas de moyen facile de distinguer ces avertissements des autres avertissements qui ne sont pas requis par la langue. Remplacer -pedantic par -pedantic-errors pour que gcc traite les violations de langage comme des erreurs fatales.

Un bref historique de la norme:

  • C89 a été la première norme C officielle, publiée par ANSI en 1989.
  • C90 était la version ISO de la norme, décrivant exactement le même langage que C89. L'ANSI a officiellement adopté la version ISO de la norme. Il y a eu deux rectificatifs techniques, corrigeant certaines erreurs.
  • C95 était un amendement à C90, ajoutant quelques fonctionnalités, principalement des digraphes et un support de caractères larges. Pour autant que je sache, une version fusionnée n'a jamais été publiée.
  • La C99 a été publiée par l'ISO en 1999. Il y avait trois rectificatifs techniques.
  • C11 a été publié par l'ISO en 2011. Il y a eu un rectificatif technique, fixant les définitions de __STDC_VERSION__ et __STDC_LIB_EXT1__.

L'ANSI n'a pas publié ses propres versions des normes 1999 ou 2011, adoptant plutôt les normes ISO.

N1256 est un projet disponible gratuitement de la norme C99, avec les 3 rectificatifs techniques fusionnés.

N157 est un projet de norme C11 disponible gratuitement. Il existe quelques différences mineures entre celui-ci et la norme C11 publiée, plus un rectificatif technique. Pour plus de détails, voir ma réponse à cette question .

62
Keith Thompson

informations utiles de info gcc pour gcc6 et https://gcc.gnu.org/onlinedocs/gcc-5.4.0/gcc/Standards.html#Standards pour gcc5

version gcc 6.3.1 - 7.3.1

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

version 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

Pour C, le mode par défaut reste std = gnu11, mais pour C++ il est passé de std = gnu ++ 98 à std = gnu ++ 14

15
Varun Garg

Programme de test minimal

Si vous avez envie de le découvrir empiriquement sans lire aucun manuel.

c.c

#include <stdio.h>

int main(void) {
#ifdef __STDC_VERSION__
    printf("__STDC_VERSION__ = %ld \n", __STDC_VERSION__);
#endif
#ifdef __STRICT_ANSI__
    puts("__STRICT_ANSI__");
#endif
    return 0;
}

Testez avec:

#!/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

Résultat:

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

Conclusion: gnu17 est utilisé par défaut:

C++

main.cpp

#include <iostream>

int main(void) {
#ifdef __cplusplus
    std::cout << __cplusplus << std::endl;
#endif
#ifdef __STRICT_ANSI__
    std::cout << "__STRICT_ANSI__" << std::endl;
#endif
    return 0;
}

Testez avec:

#!/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

Résultat:

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

Conclusion: gnu++14 est la valeur par défaut:

  • __cplusplus: macro définie par la norme C++ y compris sur C++ 98

Testé sur Ubuntu 18.10, GCC 8.2.0. GitHub en amont .

La première ligne donnera votre version GCC (4.7.2)

(Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2

Lorsque vous compilez votre code, vous pouvez spécifier la révision C/C++ que vous souhaitez utiliser, en ajoutant -std=c99 ou -std=c99 ...

Remarque gnu89 est utilisé par défaut.

3
ablm

Une chose à savoir, l'option -std = de gcc ne peut pas être utilisée pour "sandboxer" le compilateur en ne prenant pas en charge les constructions des versions ultérieures du standard C. Cela est vrai avec ou sans -pedantic

Vous ne pouvez pas compter sur gcc -std=c89 -pedantic pour vous donner des erreurs ou des avertissements si vous essayez de compiler à l'aide de certaines constructions de code C99. Dans certains cas, ce sera le cas, dans d'autres non. Par exemple, il compilera avec plaisir du code qui utilise le %zu spécificateur de format dans un appel printf (), même s'il n'a pas été ajouté avant C99.

0
Randy Howard