57 votes

Pourquoi «int;» compile-t-il bien en C mais pas en C ++?

Considérons le programme suivant (voir la démo ici).

#include <stdio.h>
int main(void)
{
      int ;  // Missing variable name
      puts("Surprise");
}

Mon compilateur gcc 4.8.1, donne l'avertissement ci-dessous:

[Avertissement] inutile de nom de type à vide déclaration [activé par défaut]

Pourquoi faut-il compiler amende? Ne devrais-je pas obtenir une erreur de compilateur? g++ 4.8.1 donne l'erreur suivante quand j'ai compiler un programme C++:

[Erreur] déclaration de ne pas déclarer quoi que ce soit [-fpermissive]

48voto

n.m. Points 30344

La norme C dit

Une déclaration autres que les static_assert déclaration est tenu de déclarer au moins une déclaration (autres que les paramètres d'une fonction ou les membres d'une structure ou d'une union), un tag, ou les membres d'une énumération.

C++ dit

En un simple déclaration, l'option init-demande de déclaration-la liste peut être omis seulement lors de la déclaration d'une classe (article 9) ou une énumération.

Une violation de ce dans les deux langues nécessite un diagnostic. Les normes ne parle pas de compilateur des erreurs ou des avertissements. Un message d'avertissement est un diagnostic.

34voto

AndreyT Points 139512

Votre code est illégal (c'est à dire erronée, mal formé, contrainte-violation) en C et C++. La raison pour laquelle vous obtenez un "avertissement" dans une langue et d'une "erreur" dans un autre est juste un caprice de votre compilateur et votre compilateur de l'installation. Après tout, ni la langue formellement la distinction entre "mises en garde" et "erreurs". GCC sous ses paramètres par défaut se produit juste pour être plus permissive en C mode (surtout pour des raisons historiques).

Utiliser -pedantic-errors dans GCC, et vous obtiendrez une "erreur" dans le code C ainsi. (À noter qu' -pedantic-errors ne se contente pas aveuglément à son tour tous les "avertissements" dans "erreurs". Il tente d'indiquer uniquement les violations de contrainte des "erreurs".)

18voto

Yu Hao Points 40603

La syntaxe de déclaration est définie comme (en omettant init-demande de déclaration-la liste et l'initialisation de demande de déclaration):

C11 6.7 Déclarations

declaration:
    declaration-specifiers init-declarator-list opt ;
    static_assert-declaration
declaration-specifiers:
    storage-class-specifier declaration-specifiers opt
    type-specifier declaration-specifiers opt
    type-qualifier declaration-specifiers opt
    function-specifier declaration-specifiers opt
    alignment-specifier declaration-specifiers opt

Notez que la déclaration de spécificateurs est définie de manière récursive, mais chacun avec un opt indique qu'il est facultatif.

Aussi, la clause suivante 6 membres:

La déclaration des prescripteurs sont constitués d'une séquence de prescripteurs qui indiquent le lien, durée de stockage, et une partie de la type des entités qui le declarators désigner. Le initdeclarator-liste séparée par des virgules de la séquence de declarators, qui peuvent avoir des informations de type supplémentaires, ou un initialiseur, ou les deux. Le declarators contenir les identifiants (le cas échéant) être déclaré.

Notez les mots si tout.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X