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


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

#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 la declaración vacía [habilitado por defecto]

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

[Error] la declaración no declara nada [- fpermissive]

Author: Peter Mortensen, 2015-10-22

3 answers

El estándar C dice

Una declaración que no sea una declaración static_assert deberá declarar al menos un declarador (que no sea 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 simple-declaration, la lista opcional init-declarator-list solo se puede omitir cuando se declara una clase (Cláusula 9) o enumeración.

Una violación de esto en cualquiera de los dos idiomas requiere un diagnostico. Los estándares no hablan de errores del compilador o advertencias. Una advertencia es un diagnóstico.

 47
Author: n.m.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-22 05:21:35

Su código es ilegal (es decir, erróneo, mal formado, violador de 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 del compilador. Después de todo, ninguno de los dos idiomas diferencia formalmente entre "advertencias"y " errores". GCC bajo su configuración predeterminada resulta ser más permisivo en el modo C (principalmente por razones históricas).

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

 34
Author: AnT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-22 05:35:16

La sintaxis de la declaración se define como (omitiendo init-declaradores-lista y init-declarador):

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 declaration-specifiersse define recursivamente, pero cada uno con un opt indica que es opcional.

También, la siguiente cláusula 6 establece:

Los especificadores de declaración consisten en una secuencia de especificadores que indican la vinculación, duración del almacenamiento, y parte de el tipo de entidades que denotan los declarantes. La lista initdeclarator 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 (en su caso) que se están declarando.

Note las palabras si las hay.

 18
Author: Yu Hao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-22 04:59:40