ANSI C vs autres normes C
Sur plusieurs compilateurs que j'ai utilisés (tous les gcc
mais différentes versions), j'obtiens une erreur C99 mode
pour des choses comme déclarer int i
dans l'expression de la boucle for au lieu d'avant (si je n'utilise pas l'option std=c99
). Après avoir lu ici je comprends que les options gcc
-ansi
, -std=c89
, et -std=iso9899:1990
Tous évaluent à la norme ANSI C, mais je ne comprends pas pourquoi / si je devrais choisir la norme c89
par rapport à une norme plus récente comme c99
(qui est le plus récent I supposer).
En outre, je vois plusieurs versions des normes de type iso
pour le langage C, dont la première (de ma compréhension) est un port direct de la norme ANSI. est-il sûr de dire que iso
mettra à jour leur norme pour C mais la norme ANSI originale pour C sera toujours la même?
Question Bonus:
Je peux réellement comprendre celui-ci moi-même, je n'ai pas encore pris le temps de le faire, donc si quelqu'un connaît le haut de leur tête alors c'est génial, sinon pas de biggie, je vais le comprendre plus tard:)
J'ai une impression assez nouvelle du livre The C Programming Language (ANSI)
. Mon livre montre toujours pour les boucles comme ceci:
int i;
for(i = 0; i < foo; i++)
Mais beaucoup de gens (dont la plupart ont plus de talent en programmation dans leur petit doigt) écrivent leurs boucles for comme ceci:
(int i = 0; i < foo; i++)
Est-il correct de dire si j'écris la boucle de la première façon alors i
devrait être accessible à toute la fonction, mais si je l'écris de la deuxième façon alors {[15] } n'est accessible qu'à la boucle for quel que soit de la norme avec laquelle je compile? Une autre façon de poser cette même question, si je compile avec le standard c89
les i
des deux boucles for seront-ils accessibles à toute la fonction et si je compile avec le standard c99
le i
de la première boucle for sera-t-il accessible à toute la fonction alors que le i
de la seconde boucle for sera accessible uniquement par la boucle for?
4 réponses
Je ne comprends pas pourquoi / si je devrais choisissez la norme c89 par rapport à une plus récente standard comme c99 (qui est le plus récent J'assume).
Quelques raisons:
1) Le support C99 de gcc n'est pas tout à fait complet, alors que son support C89 l'est. C'est pourquoi C89 (avec les extensions GNU) est la valeur par défaut. Donc, si vous êtes un stickler absolu pour la programmation À une norme en utilisant gcc, choisissez C89.
2) le compilateur de Microsoft ne supporte pas vraiment C99 du tout. Donc, si vous voulez écrire portable C code, C89 est une norme commune.
Est sûr de dire que iso mettra à jour leur norme pour C mais l'original La norme ANSI pour C sera toujours la de même?
Non, L'ISO C99 a également été ratifiée en tant que norme ANSI. Le nom "ansi" étant attaché à C89 seulement est un accident historique malheureux. Cela dit, C89 sera toujours C89, ce n'est tout simplement pas la norme ANSI C la plus récente.
Est-il correct de dire si j'écris le boucle la première façon alors que je devrais être accessible à l'ensemble de la fonction, mais si je l'écris la deuxième façon alors je suis uniquement accessible à la boucle for Quelle que soit la norme que je compile avec?
Vous ne pouvez pas l'écrire de la deuxième manière en C89 (c'est-à-dire avec -pedantic
pour adhérer à la norme), donc il n'y a pas de "quelle que soit la norme". Les versions de C avec des extensions GNU ne sont pas des standards, ce sont des "dialectes" (du moins c'est ce que la page de manuel les appelle). En C89, la deuxième boucle n'est pas légale, en C99 le second limite la portée de i
à la boucle. Évidemment, dans les deux cas, la première boucle donne i
une portée plus large.
En fait, gcc n'aime pas la deuxième boucle dans C89 même avec les extensions GNU activées.
C a été standardisé comme C89 par ANSI. Il a ensuite été normalisé par L'ISO comme C90; il n'y a pas de différences techniques entre C89 et C90.
C99 est une révision de la norme C; elle a été développée par le Comité C de L'ISO et normalisée par L'ISO et L'ANSI. C89 et C99 sont des normes ANSI. Dans le langage courant, l'expression "ANSI C" se réfère généralement à C89; le K & R 2nd ed. livre couvre seulement C89, pas C99.
Pourquoi choisiriez-vous d'utiliser une ancienne version de C? Eh bien, il y a à moins deux raisons. Tout d'abord, vous pouvez avoir un compilateur qui ne prend pas en charge C99 (par exemple, Microsoft Visual C++ ne prend en charge que C89). Deuxièmement, il y a beaucoup de code hérité qui utilise des choses de C89 qui ne sont pas autorisées dans C99 (vous pouvez en voir plus à la question "compatibilité ascendante C99"; cela renvoie également au document de justification C99 qui décrit les différences).
En ce qui concerne la "question bonus", vous ne pouvez pas déclarer une variable dans une instruction for en C89; vous pouvez en C99. En C89, la première partie d'une instruction est une expression.
Je n'ai pas d'explication approfondie pour les normes C.
Mais ma position par défaut a été d'utiliser C99 quand on en a l'occasion. Le fait que ce soit la dernière norme développée est une raison (j'ai un sens erroné que "plus récent est meilleur").
La raison principale est que je peux déclarer des variables dans les boucles for.
C99 valide:
for (int i = 0; i < 100; i++)
{
doSomething();
}
C89, ANSI et plus:
int i;
for (i = 0; i < 100; i++)
{
doSomething();
}
L'implémentation C99 de gcc n'est pas encore terminée, mais assez facilement dans la vie quotidienne des programmeurs. Je n'ai pas la référence à portée de main, mais pour gcc il y a une déclaration quelque part qu'ils passeront à C99 (ou simplement à leur dialecte gnu99) le jour où cette implémentation est considérée comme terminée.
La question de l'utilisation des fonctionnalités C99 ou non, est divisée en une partie pragmatique:
- pour quelles plates-formes je dois compiler mon code
- quoi caractéristiques gagnerais-je (à mon goût beaucoup de propreté et de facilité à programmer portable)
Et une partie émotionnelle / idéologique. Pour le plus tard, il n'y a pas de remède, mais l'application du dinosaure principe.