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é.
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:
__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 .
informations utiles de info gcc
pour gcc6 et https://gcc.gnu.org/onlinedocs/gcc-5.4.0/gcc/Standards.html#Standards pour gcc5
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'.
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
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:
__STRICT_ANSI__
: Extension GCC définie pour -std=c
mais pas pour -std=gnu
, voir: https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html__STDC_VERSION__
: Macro C99 + ANSI C définie pour chaque version. Non présent dans C89 où il n'était pas encore défini par la norme.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++ 98Testé 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.
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.