74 votes

Demi-colon après les déclarations de classe

Toutes mes excuses à l'avance pour ce qui est probablement une question stupide, mais dans des classes C++, pourquoi le point-virgule après l'accolade de fermeture? Je fais régulièrement de l'oublier et d'obtenir des erreurs de compilation, et donc perte de temps. Semble un peu superflue pour moi, ce qui est peu probable d'être le cas. Les gens vraiment faire des choses comme

class MyClass
{
.
.
.
} MyInstance;

Edit: je l'obtenir à partir d'une C compatibilité du point de vue de leurs structures et les énumérations, mais étant donné que les classes ne font pas partie du langage C, je suppose que c'est principalement le garder une cohérence entre la déclaration similaire constructions. Ce que je cherchais était plus liée à la conception des explications plutôt que d'être en mesure de changer quoi que ce soit, bien qu'un bon code de l'achèvement de l'IDE peut recouvrir ce avant la compilation.

60voto

Nathan Points 1669

Le lien fourni par @MichaelHeran semble la cause racine. Le point-virgule (comme d'autres l'ont souligné) est héritée de C. Mais cela n'explique pas pourquoi C utilisé en premier lieu. La discussion inclut ce joyau de l'exemple:

struct fred { int x; long y; }; 
main() 
{ 
  return 0; 
} 

Les anciennes versions de C avait implicite de l'int type de retour d'une fonction à moins de déclaration contraire. Si nous omettons l' ; à la fin de la définition de la structure, nous ne sommes pas seulement la définition d'un nouveau type fred, mais aussi de déclarer qu' main() renvoie une instance de fred. I. e. le code pourrait être analysée comme ceci:

struct fred { int x; long y; } main()
{ 
  return 0; /* invalid return type, expected fred type */
} 

43voto

JaredPar Points 333733

Le point-virgule après l'accolade fermante dans une déclaration de type est requis par la langue. Il a été ainsi depuis les premières versions de C.

Et oui, les gens ne le font d'ailleurs la déclaration que vous venez de mettre en place. Il est utile pour la création d'étendue de types à l'intérieur de méthodes.

void Example() {
  struct { int x; } s1;
  s1.x = 42;

  struct ADifferentType { int x; };
}

Dans ce cas, je pense qu'il est clair que les points-virgules sont nécessaires. Pourquoi il est nécessaire dans le cas plus général de la déclarer dans le fichier d'en-tête, je n'en suis pas sûr. Ma conjecture est qu'il est historique et a été fait pour rendre l'écriture le compilateur plus facile.

17voto

unwind Points 181987

Je suppose que c'est parce que les classes sont des déclarations, même lorsqu'elles ont besoin d'accolades pour le regroupement. Et oui, il y a l'argument historique que depuis en C, vous pouvez faire

 struct
{
  float x;
  float y;
} point;
 

En C ++, vous devriez pouvoir faire la même chose. Il est donc logique que la déclaration class se comporte de la même manière.

10voto

Stefan Steinegger Points 37073

C'est court pour

 class MyClass
{
.
.
.
};

// instance declaration
MyClass MyInstance;  // semicolon here
 

Le point-virgule après les accolades de la déclaration de classe est en fait excessif, mais c'est ainsi que C ++ est défini. Le point-virgule après la déclaration de la variable est toujours nécessaire et a un sens.

5voto

Mykola Golubyev Points 21210

Je n'utilise pas de telles déclarations

 class MyClass
{
.
.
.
} MyInstance;
 

Mais dans ce cas, je peux comprendre pourquoi le point-virgule est là.
Parce que c'est comme int a; - déclaration de variable.

Probablement pour des raisons de cohérence, vous pouvez omettre le point-virgule 'MyInstance'.

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