Punto y coma después de llaves de declaración de clase

82

En las clases de C ++, ¿por qué el punto y coma después de la llave de cierre? Regularmente lo olvido y obtengo errores de compilación, y por lo tanto pierdo tiempo. Me parece algo superfluo, lo que es poco probable que sea el caso. ¿Realmente la gente hace cosas como:

class MyClass
{
.
.
.
} MyInstance;

Lo obtengo desde el punto de vista de compatibilidad de C para estructuras y enumeraciones, pero dado que las clases no son parte del lenguaje C, supongo que es principalmente para mantener la coherencia entre construcciones de declaración similares.

Lo que estaba buscando estaba más relacionado con la lógica del diseño que con poder cambiar nada, aunque un buen IDE de finalización de código podría atrapar esto antes de la compilación.

SmacL
fuente
4
Esto podría ayudar: cpptalk.net/…
Michael Haren
@Michael, gracias por el enlace. Desde una perspectiva histórica, tiene sentido, y si C ++ permite todas las gramáticas en C, y las clases de C ++ son sinónimos de estructuras, nos quedamos con el punto y coma necesario al final de la clase.
SmacL
3
@Brian, sí, una pregunta seria. Soy muy consciente de que tengo que vivir con eso, pero tengo curiosidad sobre la lógica detrás del diseño y la implementación.
SmacL
De acuerdo, pero quizás debería editar su pregunta para incluir la justificación del diseño que deseaba. Tal como está, anima a la gente a hacer preguntas como "¿por qué el corsé"? :) Puede que te interese leer Design & Evolution of C ++ de Stroustrup, aunque cubre temas más importantes que el punto y coma al final de las clases.
Brian Neal
@Brian, bastante justo, y estaba en el límite en cuanto a si usarlo o no en la wiki. La pregunta se hizo después de omitir un punto y coma en un encabezado que se usa regularmente en una versión grande. Me costó media hora, de ahí la visita a SO. Pregunta editada según su sugerencia.
SmacL

Respuestas:

47

El lenguaje requiere el punto y coma después de la llave de cierre en una declaración de tipo. Ha sido así desde las primeras versiones de C.

Y sí, la gente de hecho hace la declaración que acaba de poner allí. Es útil para crear tipos de ámbito dentro de métodos.

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

  struct ADifferentType { int x; };
}

En este caso, creo que está claro por qué se necesitan los puntos y coma. En cuanto a por qué es necesario en el caso más general de declarar en el archivo de encabezado, no estoy seguro. Mi conjetura es que es histórico y fue hecho para hacer la escritura más fácil el compilador.

JaredPar
fuente
¿Por qué no puedo crear un tipo de ámbito sin especificar MyInstance? Parece extraño cuando combina dos acciones: declarar un nuevo tipo y declarar una nueva variable.
Mykola Golubyev
@Mykola puedes hacer ambas cosas. Vea la muestra que agregué
JaredPar
70

El enlace proporcionado por @MichaelHaren parece proporcionar la causa raíz . El punto y coma (como han señalado otros) se hereda de C. Pero eso no explica por qué C lo usó en primer lugar. La discusión incluye esta joya de ejemplo:

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

Las versiones anteriores de C tenían un tipo de retorno int implícito de una función a menos que se declarara lo contrario. Si omitimos ;al final de la definición de la estructura, no solo estamos definiendo un nuevo tipo fred, sino que también declaramos que main()devolverá una instancia de fred. Es decir, el código se analizaría así:

struct fred { int x; long y; } main()
{ 
  return 0; /* invalid return type, expected fred type */
} 
Nathan
fuente
1
Sí, el tipo de retorno int implícito afectaría todo aquí. Bonita joya
Gaspa79
17

Supongo que es porque las clases son declaraciones, incluso cuando necesitan llaves para agrupar. Y sí, existe el argumento histórico de que dado que en C puedes hacer

struct
{
  float x;
  float y;
} point;

en C ++ debería poder hacer algo similar, tiene sentido que la classdeclaración se comporte de la misma manera.

relajarse
fuente
10

Es corto para

class MyClass
{
.
.
.
};

// instance declaration
MyClass MyInstance;  // semicolon here

El punto y coma después de las llaves de la declaración de clase en realidad es excesivo, pero así es como se define C ++. El punto y coma después de la declaración de la variable siempre es necesario y tiene sentido.

Stefan Steinegger
fuente
1
Entonces, ¿C ++ requiere un punto y coma después de cada declaración?
Loai Nagati
1
Tenga en cuenta que, de esta manera, no puede crear un objeto de una clase anónima, mientras que puede hacerlo al revés.
Kevin
5

No uso tales declaraciones

class MyClass
{
.
.
.
} MyInstance;

Pero en este caso puedo entender por qué hay punto y coma allí.
Porque es como int a;una declaración de variable.

Probablemente por coherencia, ya que puede omitir el punto y coma de 'MyInstance' permanece allí.

Mykola Golubyev
fuente
3

Se necesita después de structpor razones de compatibilidad, y cómo le gustaría esto:

struct MyStruct { ... };
class  MyClass  { ... }    //inconsistency
Zifre
fuente
1
¿Pero de qué namespace myNamespace { ... } // inconsistent but valid?
Chris K
3

En C / C ++ el; es un terminador de declaraciones. Todas las declaraciones terminan con; para evitar la ambigüedad (y para simplificar el análisis). La gramática es coherente a este respecto. Aunque una declaración de clase (o cualquier bloque para el caso) tiene varias líneas de longitud y está delimitada con {}, sigue siendo simplemente una declaración (el {} es parte de la declaración), por lo tanto, debe terminarse con; (El; no es un separador / delimitador)

En tu ejemplo

class MyClass{...} MyInstance;

es la declaración completa. Se pueden definir múltiples instancias de la clase declarada en una sola declaración.

class MyClass{...} MyInstance1, MyInstance2;

Esto es completamente consistente con declarar múltiples instancias de un tipo primitivo en una sola declaración:

int a, b, c;

La razón por la que uno no ve a menudo tal desclaración de clase e instancia, es que la instancia podría? Solo? ser una variable global, y realmente no desea objetos globales a menos que sean estructuras estáticas y / o simples de datos antiguos.

Roger Nelson
fuente
2
Pero la definición de función también es una declaración, pero sin punto y coma.
Jiapeng Zhang