c++ - oficial - iso/iec 14882:2017
void, VOID, C y C++ (3)
Sí, hasta donde sé, la segunda declaración no es válida en C ++ y C89, pero es válida en C99.
Del borrador C99, TC2 ( 6.7.5.3/10
):
El caso especial de un parámetro sin nombre de tipo vacío como el único elemento en la lista especifica que la función no tiene parámetros.
Está explícitamente hablando del tipo "vacío", no de la palabra clave.
De The C ++ Standard, 8.3.5/2
:
Si la cláusula-declaración-parámetro está vacía, la función no toma argumentos. La lista de parámetros
(void)
es equivalente a la lista de parámetros vacía.
Que significa que la palabra clave real con "nulo", y no el tipo general "nulo", también se puede ver desde uno de los casos en los que falla la deducción del argumento de la plantilla ( 14.8.2/2
):
- Intentando crear un tipo de función en la cual un parámetro tiene un tipo de vacío.
Se dejó en claro por otros, destacando en un informe de problema de lenguaje central aquí y algunos informes de errores de GCC vinculados por otras respuestas.
Para recapitular, su GCC tiene razón, pero las versiones anteriores de GCC estaban equivocadas. Por lo tanto, ese código podría haber sido compilado con éxito antes. Debe corregir su código, de modo que use "void" para ambas funciones, luego compilará también con otros compiladores (comeau también rechaza la segunda declaración con ese "VOID").
Tengo el siguiente código:
typedef void VOID;
int f(void);
int g(VOID);
que compila muy bien en C (usando gcc 4.3.2 en Fedora 10). El mismo código compilado como C ++ me da el siguiente error:
void.c:3: error: ‘<anonymous>’ has incomplete type
void.c:3: error: invalid use of ‘VOID’
Ahora, esto es algo en la biblioteca externa y me gustaría que el propietario solucione ese problema. Entonces tengo una pregunta: ¿el estándar C ++ prohíbe esta construcción? ¿Podría darme un puntero / cita? Lo único que recuerdo es que la declaración de función con (void) para señalar la lista de parámetros vacíos está en desuso en C ++, pero no entiendo por qué typedefed VOID no funciona.
Acabo de poner su código en un archivo .cpp, y se compiló sin problemas en VS2005, SUSE, Redhat y Solaris, así que supongo que su versión específica de gcc no aprueba esto. Galón