Forcer le compilateur à la norme C99

J’étais en train de coder sur mon projet lorsque j’ai découvert que les structures anonymes que j’utilisais depuis un moment ne sont actuellement disponibles qu’en C11, pas C99, la norme contre laquelle je veux coder.

Étant donné le code suivant:

struct data { int a; struct { int b; int c; }; }; int main() { struct data d; da = 0; db = 1; dc = 2; return 0; } 

Ce code ne doit être compilé qu’en C11 (ou si les extensions du compilateur fournissent cette fonctionnalité et sont activées). Voyons les résultats sur différents compilateurs:

clang 5

 comstackr: Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn) Target: x86_64-apple-darwin13.1.0 Thread model: posix command: clang -std=c99 -Wall test.c -o test result: **OK** 

gcc 4.1

 comstackr: gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54) command: gcc -std=c99 -Wall test.c -o test result: **NOT OK** test.c:6: warning: declaration does not declare anything test.c: In function 'main': test.c:14: error: 'struct data' has no member named 'b' test.c:15: error: 'struct data' has no member named 'c' 

gcc 4,7

 comstackr: gcc (GCC) 4.7.2 20121109 (Red Hat 4.7.2-8) command: gcc -std=c99 -Wall test.c -o test result: **OK** test.c: In function 'main': test.c:11:14: warning: variable 'd' set but not used [-Wunused-but-set-variable] 

J’ai toujours essayé de forcer le compilateur en mode C99 en spécifiant -std=c99 , mais cela ne fonctionne évidemment pas (sauf pour gcc 4.1 qui comstack sans le paramètre -std). Ma question est donc la suivante: comment puis-je forcer les compilateurs gcc et clang, quelle que soit leur version, à émettre une erreur si j’écris un code non conforme à la norme spécifiée avec -std ? Existe-t-il un argument en ligne de commande que je ne connais pas?

-std=c99 ne désactive pas les extensions de langage (GNU C n’a pas de structure en C99).

Les -pedantic (ou -pedantic-errors ) avertissent le compilateur des extensions de langage.

clang et clang permettent tous deux un grand nombre d’extensions et ici pour clang . clang tente en général de prendre en charge la plupart des extensions clang par gcc . Les deux vont même vous permettre d’utiliser des fonctionnalités C uniquement en C ++, par exemple les VLA qui sont une fonctionnalité C99 .

Dans ce cas, les deux vous permettent d’utiliser des champs de structure / union sans nom dans les structures / unions en mode C99 , même s’il s’agit d’une fonctionnalité C11 .

Les normes linguistiques sockets en charge par GCC indiquent bien quels indicateurs sont nécessaires pour transformer ces avertissements en erreurs et avertissements. Pour autant que je sache, clang respecte les mêmes conventions:

[…] pour obtenir tous les diagnostics requirejs par le standard, vous devez également spécifier -pedantic (ou -pedantic-errors si vous souhaitez qu’il s’agisse d’erreurs plutôt que d’avertissements). […]

So -pedantic vous avertira si vous utilisez une extension et -pedantic-errors transformera ces avertissements en erreur. Avec l’ -pedantic , vous devriez voir un avertissement comme celui-ci dans gcc :

avertissement: ISO C99 ne prend pas en charge les structures / unions non nommées [-Wpedantic]

et cela en clang ( voir en direct ):

warning: les structures anonymes sont une extension C11 [-Wc11-extensions]

et cela se transforme en erreur avec des erreurs -pedantic-errors .