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").