Question

Sur plusieurs compilateurs je l'ai utilisé (tous gcc mais différentes versions) je reçois une erreur de C99 mode pour des choses comme déclarant int i l'intérieur de la boucle d'expression au lieu d'avant (si je ne pas utiliser l'option de std=c99). Après avoir lu Je comprends que les options de gcc -ansi, -std=c89 et -std=iso9899:1990 tous être évalués à la norme ANSI C, mais je ne comprends pas pourquoi / si je prends la norme c89 par rapport à une norme plus récente comme c99 (ce qui est le plus récent, je suppose).

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-ce est sûr de dire que iso mettra à jour leur niveau C, mais la norme d'origine ANSI C sera toujours le même?

Question bonus:

Je ne peux vraiment comprendre cela moi-même, je viens pas pris le temps de le faire encore, donc si quelqu'un sait du haut de leur tête alors ce qui est grand, sinon pas trop grave, je vais le découvrir plus tard:)

J'ai une impression assez nouvelle de la The C Programming Language (ANSI) du livre. Mon livre toujours des spectacles pour les boucles comme ceci:

int i;

for(i = 0; i < foo; i++)

, mais beaucoup de gens (la plupart qui ont plus de talent dans leur programmation petit doigt) écrire leur pour les boucles comme ceci:

(int i = 0; i < foo; i++)

Est-il exact de dire si j'écris la boucle la première manière alors i doit être accessible à l'ensemble de la fonction, mais si je l'écris la deuxième façon alors i est accessible uniquement à la boucle INDÉPENDAMMENT de ce que la compilation standard I avec? Une autre façon de poser cette même question, si je compile avec la norme c89 sera la i des deux pour les boucles accessibles à l'ensemble de la fonction et si je compile avec la norme c99 sera la i de la première boucle soit accessible à l'ensemble de la fonction tandis que le i de la deuxième boucle sera accessible uniquement par la boucle?

Était-ce utile?

La solution

  

Je ne comprends pas pourquoi / si je dois   choisir la norme C89 par rapport à une version plus récente   standard comme c99 (ce qui est le plus récent   Je suppose).

Quelques raisons:

1) le soutien de gcc C99 est pas tout à fait complet, alors que son soutien C89 est. C'est pourquoi C89 (avec des extensions GNU) est la valeur par défaut. Donc, si vous êtes un Stickler absolu pour la programmation à un standard en utilisant gcc, choisissez C89.

2) compilateur Microsoft ne supporte pas vraiment C99 du tout. Donc, si vous voulez écrire du code portable C, C89 est une norme commune.

  

Est est sûr de dire que l'ISO mettra à jour   leur niveau C, mais l'original   norme ANSI C sera toujours la   même?

Non, ISO C99 a également été ratifié comme norme ANSI. Le nom « ansi » étant attaché à C89 est seulement un accident historique malheureux. Cela dit, C89 sera toujours C89, il est tout simplement pas la plus récente norme ANSI C.

  

Est-il exact de dire si j'écris la   boucle la première manière alors je devrais être   accessible à l'ensemble de la fonction, mais   si je l'écris la deuxième façon alors i est   uniquement accessible à la boucle for   Indépendamment de ce que la norme I compilation   avec?

Vous ne pouvez pas écrire la deuxième façon C89 (à savoir avec -pedantic à adhérer à la norme), donc il n'y a pas « quel que soit le standard ». Les versions de C avec des extensions GNU ne sont pas des normes, ils sont « dialectes » (au moins c'est ce que la page de manuel les appelle). Dans la deuxième boucle C89 est pas légal, en C99 la seconde limite le champ d'i à la boucle. Il est évident que dans les deux cas, la première boucle donne i une portée plus large.

En fait, gcc ne pas comme la deuxième boucle en C89 même avec des extensions GNU activées.

Autres conseils

C a été normalisée en 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; il a été mis au point par le comité ISO C et normalisé par l'ISO et ANSI. Les deux C89 et C99 sont des normes ANSI. Dans le langage courant, l'expression « ANSI C » se réfère généralement à C89; K & R 2e éd. couvertures de livres seulement C89, C99 pas.

Pourquoi choisir d'utiliser une ancienne version de C? Eh bien, il y a au moins deux raisons. Tout d'abord, vous pouvez avoir un compilateur qui ne prend pas en charge C99 (par exemple, Microsoft Visual C ++ prend en charge uniquement C89). En second lieu, il y a beaucoup de code existant là-bas qui utilise les choses de C89 qui ne sont pas autorisés dans C99 (vous pouvez voir plus à la question ;. qui a également des liens vers le 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 un pour-déclaration C89; vous pouvez en C99. En C89, la première partie d'un pour-déclaration est une expression.

Je n'ai pas une explication approfondie des normes C.

Mais ma position par défaut a été d'utiliser C99 quand la chance. Le fait que ce fut la dernière norme développée est l'une des raisons (j'ai un sens mal que « plus récent est mieux »).

La raison principale est que je puisse déclarer des variables dans les boucles.

C99 valide:

for (int i = 0; i < 100; i++)
{
   doSomething();
}

C89, ANSI et plus:

int i;
for (i = 0; i < 100; i++)
{
   doSomething();
}

Le C99 mise en œuvre de gcc n'est pas encore terminée, mais assez usably dans la vie des programmeurs de tous les jours. Je n'ai pas la référence à portée de main, mais pour gcc il y a une part de déclaration qu'ils passeront à C99 (ou simplement à leur dialecte gnu99) le jour où cette mise en œuvre est considérée comme terminée.

La question de l'utilisation de C99 dispose ou non, est divisé en une partie pragmatique:

  • pour les plates-formes que je dois compiler mon code
  • Quelles sont les caractéristiques gagnerais-je (à mon goût beaucoup de facilité et à la propreté du programme portable)

et une partie émotionnelle / idéologique. Pour la suite, il n'y a pas de remède, mais l'application du principe de dinosaure.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top