terminar sintaxis programas programa funciones errores ejemplos dev como comandos codigos c++ c gcc language-lawyer variable-declaration

sintaxis - ejemplos de programas en c++ pdf



¿Por qué compila bien `int;` en C, pero no en C++? (3)

El estándar C dice

Una declaración que no sea una declaración static_assert declarará al menos un declarador (que no sean los parámetros de una función o los miembros de una estructura o unión), una etiqueta o los miembros de una enumeración.

C ++ dice

En una declaración simple, la lista de declaradores de inicio opcional solo se puede omitir al declarar una clase (Cláusula 9) o enumeración.

Una violación de esto en cualquier idioma requiere un diagnóstico. Los estándares no hablan sobre errores o advertencias del compilador. Una advertencia es un diagnóstico.

Considere el siguiente programa (vea la demostración en vivo here ).

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

Mi compilador, gcc 4.8.1, da la siguiente advertencia:

[Advertencia] nombre de tipo inútil en declaración vacía [habilitado por defecto]

¿Por qué se compila bien? ¿No debería obtener un error del compilador? g ++ 4.8.1 da el siguiente error cuando lo compilo como un programa C ++:

La declaración [Error] no declara nada [-permisivo]


La sintaxis de la declaración se define como (omitiendo init-declarator-list y init-declarator ):

C11 6.7 Declaraciones

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

Tenga en cuenta que los especificadores de declaración se definen de forma recursiva, pero cada uno con una opción indica que es opcional.

Además, la siguiente cláusula 6 establece:

Los especificadores de declaración consisten en una secuencia de especificadores que indican el enlace, la duración del almacenamiento y parte del tipo de entidades que los declaradores denotan. La lista de declaradores de inicio es una secuencia de declaradores separados por comas, cada uno de los cuales puede tener información de tipo adicional, o un inicializador, o ambos. Los declaradores contienen los identificadores (si los hay) que se declaran.

Tenga en cuenta las palabras si las hay .


Su código es ilegal (es decir, erróneo, mal formado, viola restricciones) tanto en C como en C ++. La razón por la que recibe una "advertencia" en un idioma y un "error" en otro es solo una peculiaridad de su compilador y su configuración de compilador. Después de todo, ninguno de los dos idiomas diferencia formalmente entre "advertencias" y "errores". El GCC bajo su configuración predeterminada resulta más permisivo en el modo C (principalmente por razones históricas).

Use -pedantic-errors en GCC, y también obtendrá un "error" en el código C. (Tenga en cuenta que -pedantic-errors no convierte ciegamente todas las "advertencias" en "errores". Intenta informar solo las violaciones de restricciones reales como "errores").