9
votes

Tableaux de longueur variable en C89?

J'ai lu que C89 ne prend pas en charge les tableaux de longueur variable, mais l'expérience suivante semble réfuter que: xxx

lorsque je compile en tant que tel (en supposant que le nom de fichier est va_test .c ): xxx

Ça fonctionne ...

Qu'est-ce que je manque? : -)


5 commentaires

Je ne te crois pas. -std = c89 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 . La valeur par défaut est -std = gnu90 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 // commentaires. Il n'est pas tout à fait clair pour moi si le // ... 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 faire confiance à une mise en œuvre pour affirmer tout degré de conformité des normes du code.


3 Réponses :


10
votes

GCC Toujours soutenu des tableaux de longueur variable Afaik. SETD -STD TO C89 ne désactive pas les extensions GCC ...

Edit: En fait, si vous vérifiez ici:

http: //gcc.gnu. org / onlineDocs / gcc / c-dialecte-options.html # c-dialecte-options

sous -std = Vous trouverez ce qui suit:

Programmes ISO C90 ( Certains GNU Extensions qui conflit avec ISO C90 sont désactivés). Comme --ansi pour c code.

Payez une attention particulière au mot «certain».


1 commentaires

Cette page a cet exemple précis à expliquer: réseau-theory.co.uk /docs/gccincintro/gccintro_28.html



2
votes

Vous manquez que sans -pedantic , 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.


9 commentaires

Vous pouvez également utiliser -pedantic-erreurs 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 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 . 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 Les avertissements peuvent généralement être blâmés sur le manifestation const 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 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 par défaut!) Mais je Ça vous dérange que la moitié des avertissements -wall 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 , 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 peuvent être un peu naggy, comme -FORTY-EMPÔTY , 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 ..


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



9
votes

C89 ne reconnaît pas // commentaires.

C89 n'autorise pas les définitions intermixées avec du code.

Vous devez fflush (stdout) après le printf pour vous assurer de saisir l'invite avant le scanf . .

Main "est meilleur" comme int Main (vide)

essayer gcc -std = c89 -pedantique ... au lieu


5 commentaires

:) ... 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 Et vous avez un 0 ... bon vieux jours ...


La seule chose que je souhaite vraiment que c89 ait été pour (int ... 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 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 >) Réalisé uniquement pour trouver l'index du terminal.


@R ..: Je suis plus un pendant personne :-)