2010-02-16 10 views
8

Y at-il une différence si je compile le programme suivant en utilisant c89 vs c99? J'ai le même résultat. Y a-t-il vraiment une différence entre les deux?C89 compilateur GCC c99

#include <stdio.h> 

    int main() 
    { 
     // Print string to screen. 
     printf ("Hello World\n"); 
    } 

gcc -o helloworld -std=c99 helloworld.c 
vs 
gcc -o helloworld -std=c89 helloworld.c 
+5

"gcc -std = c89" et "gcc -std = c99" ne sont pas entièrement conformes aux normes respectives. Ajouter "-pedantic" ou "-pedantic-errors" pour obtenir quelque chose approchant la pleine conformité. –

Répondre

6

En théorie, il devrait y avoir une différence. L'utilisation de "//" pour marquer un commentaire ne fait pas partie de C89, donc si elle appliquait correctement les règles C89, cela produirait une erreur de compilation (avec -ansi -pedantic, ça pourrait faire ça, mais je ne m'en souviens pas sûr). Cela donne une idée du caractère général: si un programme se compile en C89, il sera généralement compilé en C99 et donnera exactement les mêmes résultats. C99 vous achète principalement de nouvelles fonctionnalités qui ne sont pas présentes dans C89, donc vous pouvez utiliser (par exemple) des tableaux de longueur variable, qui ne sont pas autorisés dans C89. Cependant, vous devrez peut-être demander l'application des règles pédantes pour voir toutes les différences - C99 est destiné à standardiser la pratique existante, et certaines des pratiques existantes sont des extensions gcc, dont certaines sont activées par défaut.

+2

+1, Bonne prise; Les commentaires '//' pourraient être la seule partie de C99 qui vaut la peine d'être prise. '-ansi -pedantic' arrive avec une erreur:' main.c: 5: erreur: expression attendue avant '/' token' –

+1

Je ne vois pas comment les commentaires '//' sont plus utiles, c'est seulement deux moins de caractères ... c'est comme dire que C devrait utiliser '.' pour accéder aux membres des pointeurs vers les structures plutôt que' -> 'car cela économise le typage. –

+0

Les commentaires @JoeD '//' ne capturent qu'une ligne, ce qui signifie qu'ils sont beaucoup moins susceptibles d'être capturés par inadvertance par un autre ensemble de commentaires ou de causer des problèmes. En outre, votre argument sur '.' est un peu bête; utiliser le même opérateur pour ce qui est fondamentalement la même opération est probablement une bonne idée. – Alice

1

sur ce forum http://www.velocityreviews.com/forums/t287495-p2-iso-c89-and-iso-c99.html j'ai trouvé ceci:

Résumé: 99 est normalisé, a de nouveaux mots-clés, de nouvelles choses de tableau, les nombres complexes, les fonctions de bibliothèque et autres. Plus de compilateurs sont c89 complets puisqu'ils ont eu tout ce temps pour les faire ainsi.

A) ANSI X3.159-1989. This is the original 1989 C standard, dated December 1989, with Rationale. The main body of the language is described in section 3, and the "C library" -- stdio, functions, and so on -- in section 4.

B) ISO 9899:1990. This is the original ISO C standard. "ANSI" is the American National Standards Institute, so the international crowd have to have their own standards with their own, different, numbering system. They simply adopted ANSI's 1989 standard, removed the Rationale, and renumbered the sections (calling them "clauses" instead). With very few exceptions you can just add three, so that most of the language is described in section -- er, "clause" -- 6, and the "C library" part in section 7.

C) ISO 9899:1999. This is the newfangled "C99" standard, with its Variable Length Arrays, Flexible Array Members, new keywords like "restrict" and "_Bool", new semantics for the "static" keyword, new syntax to create anonymous aggregates, new complex-number types, hundreds of new library functions, and so on.

The new ISO standard was immediately "back-adopted" by ANSI. I have not seen any official "ANSI-sanctioned" claim about this, but given the usual numbering systems, I would expect this to be ANSI Standard number X3.159-1999. (The numbering system is pretty obvious: a standard, once it comes out, gets a number -- X. for ANSI, or just a number for ISO -- and a suffix indicating year of publication. An update to an existing standard reuses the number, with the new year.)

Although X3.159-1989 and 9899:1990 have different years and section numbering, they are effectively identical, so "C89" and "C90" really refer to the same language. Hence you can say either "C89" or "C90" and mean the same thing, even to those aware of all the subtleties.

There were also several small revisions to the original 1990 ISO standard: "Normative Addendum 1", and two "Technical Corrigenda" (numbered; giving Technical Corrigendum 1 and TC2). The two TCs are considered to be "bug fixes" for glitches in the wording of the standard, while NA1 is an actual "change". In practice, the TCs do not really affect users, while NA1 adds a whole slew of functions that people can use, so NA1 really is more significant. NA1 came out in 1994, so one might refer to "ISO 9899:1990 as modified by NA1" as "C94". I have seen it called "C95", too.

28
  • // commentaires ne sont pas une partie de C89 mais sont OK dans C99,
  • chute des main() sans retour de valeur est équivalente à return 0; dans C99, mais pas dans C89. De N1256 (pdf), 5.1.2.2.3p1:

    If the return type of the main function is a type compatible with int , a return from the initial call to the main function is equivalent to calling the exit function with the value returned by the main function as its argument; reaching the } that terminates the main function returns a value of 0.

Ainsi, votre code a un comportement non défini à C89, et le comportement bien défini dans C99.

Questions connexes