J'ai lu que C89 ne prend pas en charge les tableaux de longueur variable, mais l'expérience suivante semble réfuter que: lorsque je compile en tant que tel (en supposant que le nom de fichier est Ça fonctionne ... p> Qu'est-ce que je manque? : -) p> p> va_test .c code>): p>
3 Réponses :
GCC Toujours soutenu des tableaux de longueur variable Afaik. SETD -STD TO C89 ne désactive pas les extensions GCC ... P>
Edit: En fait, si vous vérifiez ici: P>
http: //gcc.gnu. org / onlineDocs / gcc / c-dialecte-options.html # c-dialecte-options p>
sous -std = Vous trouverez ce qui suit: p>
Programmes ISO C90 ( Certains forts> GNU Extensions qui conflit avec ISO C90 sont désactivés). Comme --ansi pour c code. p> blockQuote>
Payez une attention particulière au mot «certain». P>
Cette page a cet exemple précis à expliquer: réseau-theory.co.uk /docs/gccincintro/gccintro_28.html
Vous manquez que sans -pedantic code>, GCC n'est pas (et ne prétend pas être) un compilateur C conformiste standard. Au lieu de cela, il compile un dialecte GNU de C, qui comprend diverses extensions. P>
Vous pouvez également utiliser -pedantic-erreurs code> pour forcer des erreurs plutôt que des avertissements.
@PMG: Je déteste juste le code qui compile avec des avertissements. Chaque fois que je construis, si je vois un dépistage d'avertissements passant, je dois vérifier qu'aucun d'entre eux n'est nouveau. Et pour être consciencieux, je dois vraiment faire la même chose pour les journaux de la machine de construction, ce qui permet de faire face ça ne va pas arriver. Et une construction incrémentielle avec des avertissements n'est pas répétable - vous ne les voyez que la première fois que de nouveau avant de toucher le fichier source. Je préférerais juste les réparer, même si cela signifie accepter l'idée d'un compilateur-écrivain de la façon dont C "devrait" être écrit. Je supprimai -werror code> si les en-têtes de 3ème partie me forcent à.
@Steve: La majeure partie de mon code compile proprement, à l'exception occasionnelle de -w [no-] écriture-chaînes code>. Je n'ai tout simplement pas encore allumé, mais tu me faisais penser que je devrais me durcir un peu :-)
@PMG: Eh bien, si par la police, vous n'enregistrez rien avec des avertissements de toute façon, cela ne fait pas une énorme quantité de différence. Vous reportez à regarder les avertissements jusqu'à ce que vous soyez prêt à vous enregistrer, alors que je les regarde tout de suite pour obtenir le code compilant. -Write-Strings CODE> Les avertissements peuvent généralement être blâmés sur le manifestation
const code> de quelqu'un d'autre, donc si elles sont vraiment occupées, il peut être nécessaire de laisser passer l'avertissement .. .
Je ne me dérange pas -werror code> sauf si c'est dans Construire des scripts pour le code publié (je vais déchirer la tête de quelqu'un pour la mettre dans
Binutils code> par défaut!) Mais je Ça vous dérange que la moitié des avertissements
-wall code> produisent des "honte sur toi pour ne pas suivre nos directives de style!" plutôt que des abus réels de la langue / des erreurs potentielles. C'est une énorme douleur pour trouver quelles options (pour chaque version de compilateur) sont en fait sûre d'allumer ...
@R.: Je ne peux pas dire que j'ai des problèmes avec -wall code>, en code je m'écris. Je veux dire, les trigraphes sont super et tout, mais je ne les considère pas comme une partie importante de la langue, car j'ai un clavier approprié ;-p certains des
-wextra code> peuvent être un peu naggy, comme
-FORTY-EMPÔTY CODE>, mais je les tolère normalement.
@Steve: Parfois, GCC génère des avertissements variables non initialisés parasites lorsqu'il ne peut pas faire une analyse suffisante pour déterminer que la variable est réellement initialisée dans tous les chemins de code. Cela conduit normalement aux personnes en train d'écrire des initialisations inutiles (par exemple à 0 ou -1) pour empêcher l'avertissement / l'erreur. GCC veut aussi que je metce des charges de parenthèses dans des expressions à l'aide d'opérateurs bitwises; Mon point de vue (peut-être que mes mauvais yeux) est que plus de 2 niveaux de parenthèses deviennent illisibles en un coup d'œil, tout en connaissant la priorité de l'opérateur, est facile. Bien sûr, ces gens GNU aiment leur lisp ... ;-)
OH Un autre gros qui mord toujours est des avertissements variables inutilisés pour les arguments de la fonction, lorsque l'argument existe pour correspondre à une API de rappel ou à des exigences d'API externes plutôt que d'être utilisées par la fonction. Il est suffisamment facile de s'éteindre dans la CCG moderne, mais à la fois je crois que c'était inséparable de l'avertissement variable non utilisé dans la nature. Dans tous les cas, tout cela ajoute à un tas d'avertissements que je dois désactiver manuellement après avoir ajouté -wall -werror code> ..
@R. Assez juste, et cette initialisation inutile peut effectivement être dangereuse. Si un changement ultérieur au code ouvre un chemin véritablement non initialisé, le compilateur ne l'attrapera certainement pas et non plus un débogueur. J'essaie d'éviter d'écrire du code qui initialise toujours la variable si et seulement si l'hypothèse de Riemann est vraie, mais maintenant, vous le mentionnez, je pense qu'il y a parfois été un écart entre ce que j'en considère et que fait la GCC.
C89 ne reconnaît pas C89 n'autorise pas les définitions intermixées avec du code. P>
Vous devez // code> commentaires. P>
fflush (stdout) code> après le
printf code> pour vous assurer de saisir l'invite avant le
scanf code>. P>.
Main code> "est meilleur" comme
int Main (vide) code> p> p>
gcc -std = c89 -pedantique ... code> au lieu strong> p>
:) ... me rappelle les premiers mois de mon école d'ingénierie. À l'époque, nous avons dû coder C89 Code de conformité standard C89. 1 AVERTISSEMENT AVEC -ANSI - PEDANC CODE> Et vous avez un 0 ... bon vieux jours ...
La seule chose que je souhaite vraiment que c89 ait été pour (int ... code> déclaration de variable dans la clause de contrôle de boucle --- OH et des types d'entiers exact-largeur
J'aime aussi les macros variadiques, bien que je sois moins obsessionnel que je n'avais pas l'habitude de diffuser une exploitation forestière et ondulée sur tout mon code.
pour (int code> est diabe car vous ne pouvez pas utiliser la valeur de l'index après la fin de la boucle. Une bonne moitié de mes boucles sont des recherches pures sans corps (juste
code> >) Réalisé uniquement pour trouver l'index du terminal.
@R ..: Je suis plus un pendant code> personne :-)
Je ne te crois pas.
-std = c89 code> désactive également les inscrits avant les déclarations variables, que votre code a donc généré une erreur de compilateur si vous compilez vraiment avec
-std = C89 code>. La valeur par défaut est
-std = gnu90 code> qui prend en charge les VLAS et beaucoup d'autres extensions à la langue C89 / C90.
@R. GCC 4.3.4 (qui est ce que j'arrive à avoir) est satisfait des variables, mais n'aime pas
// code> commentaires. Il n'est pas tout à fait clair pour moi si le
// ... code> est Verbatim du code réel du questeur ou est destiné à une élision. J'aurais pensé que ce dernier.
Impair. Je suppose que cela varie entre les versions GCC et je n'ai pas essayé pendant un moment.
Je suppose. Je n'utilise pas vraiment gnu90, sauf quand je suis trop paresseux pour taper quoi que ce soit d'autre.
Cela prouve également qu'on devrait jamais i> faire confiance à une mise en œuvre pour affirmer tout degré de conformité des normes du code.