2011-10-08 15 views
5

Duplicar posible:
In C++ classes, why the semi-colon after the closing braceC++ Semicolon after class, struct, enum, ... inútil pero los compiladores aún emiten errores?

Esto es algo que me he preguntado acerca desde hace bastante tiempo, hacer eso que usted tiene que poner un punto y coma después del paréntesis de cierre de una clase, estructura o enum en C++?

Peor (o la pregunta real), ¿por qué los compiladores emiten errores al respecto cuando simplemente pueden emitir una advertencia?

¿Es realmente importante poner ese punto y coma allí y si, por qué?

Respuesta

10

Es un remanente de C. Puede declarar las variables después de la declaración cladd/struct/enum. el código:

class A{}; 
A a; 

es idéntica a:

class A{} a; 

El compilador necesita la ; saber que no desea declarar variables después de la declaración de la clase.

2

¿por qué tiene que poner un punto y coma después del corchete de cierre de una clase, struct o enum en C++?

Respuesta real, porque el estándar C++ lo dice. El lenguaje fue diseñado de tal manera que cada declaración debe terminar con un ;.

Un objeto de la clase se puede declarar como:

class MyClass 
{ 
    //Members  
}obj; 

Y de ahí el ; en el extremo de la abrazadera.

Peor (o la pregunta real), ¿por qué los compiladores emiten errores al respecto cuando simplemente pueden emitir una advertencia?

El compilador emite una advertencia cuando se pone en duda algo podría estar mal o potencialmente peligrosos

El compilador emite un error cuando el programa no sigue las pautas sintácticas establecidas por la norma, dejando de lado el punto y coma en los casos que mencionas viola las reglas de sintaxis mencionadas por el estándar de C++ y, por lo tanto, el error.

8

¿Es realmente importante poner ese punto y coma allí y si, por qué?

Sí. Esto puede ser útil alguna vez.

Se puede definir una estructura, y puede declarar un objeto como:

struct A 
{ 
    //members 
} obj; 

obj es un objeto de tipo A, y declarar esto sólo como se muestra arriba. Es de la misma manera que puso punto y coma después de la declaración de variables, tales como:

int i;      //declares i of type int 
std::string s;    //declares s of type std::string 
struct {int x,y,z;} point; //declares point of an unnamed struct type 

dos Aquí primeras declaraciones muy familiar, pero el último se ve un poco extraño, ya que define una estructura sin nombre, y al mismo tiempo declara un objeto llamado point de la estructura sin nombre.

La conclusión es que pone un punto y coma después de declarar objetos de manera uniforme, sin importar cómo declare los objetos, sin importar cuáles sean sus tipos.

No sólo eso, incluso se puede typedef de manera uniforme:

typedef int my_int; 
typedef std::string my_string; 
typedef struct {int x,y,z;} my_point; 

Ahora todos estos my_int, my_string, y my_point son tipos.

Pero cuando no hace ninguno de ellos (es decir, no declarando objetos ni definiendo typedefs), simplemente deja el lugar como tal, en blanco, sin declaración/definición alguna. Pero el punto a tener en cuenta es que te proporciona una característica interesante y útil todo el tiempo.

3

Las definiciones de clase, estructura y enumeraciones son las definiciones. Y las definiciones en C++, como en C, deben terminarse con un punto y coma. Si no pones habría una gran cantidad de ambigüedades:

struct X 
{ 
} //no ; 
foo() //no return value 
{ 
} 

Esto se lee como una función foo que devuelve una estructura, no una estructura y una función que devuelve un entero (omite,). Esto es C válido, pero no C++.

int *x; 
void foo() 
{ 
    struct S { } //no ; 
    *x = 3; // <--- what is this? 
} 

Es la segunda x una variable local de tipo pointer-to-S, o es una referencia a nivel mundial x? Usted simplemente no puede decir.

Hay muchos otros ejemplos, probablemente pueda pensar unos pocos, si lo intenta.

+0

Las definiciones de las funciones no necesitan el punto y coma, y ​​aún cuentan como definiciones. –

+0

Cierto, y también lo son los espacios de nombres. Sí, he generalizado un poco ... – rodrigo

Cuestiones relacionadas