2009-02-12 23 views
12

tengo el siguiente código:nula, inválida, C y C++

typedef void VOID; 
int f(void); 
int g(VOID); 

que compila 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 para solucionar 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.

+0

Por lo que vale, Visual C++ 2008 no tiene un problema con ese código. –

+4

En windows.h suele ser un definir '#define VOID void'. – Ismael

Respuesta

17

Sí, hasta donde yo sé, la segunda declaración no es válida en C++ y C89, pero es válida en C99.

De El proyecto C99, TC2 (6.7.5.3/10):

The special case of an unnamed parameter of type void as the only item in the list specifies that the function has no parameters.

Se habla explícitamente sobre el tipo de "vacío", no la palabra clave.

De La C++ estándar, 8.3.5/2:

If the parameter-declaration-clause is empty, the function takes no arguments. The parameter list (void) is equivalent to the empty parameter list.

Eso significa que la palabra clave real con el "vacío", y no el tipo general "vacío" también puede verse en uno de los casos en los que la deducción argumento de plantilla falla (14.8.2/2):

  • Attempting to create a function type in which a parameter has a type of void.

Se puso claro por otros, notable en un núcleo informe here cuestión de la lengua y algunos informes de fallos del CCG vinculados a otras respuestas.


En resumen, su GCC es correcto 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").

+3

¿Eso implica que es válido en C++ 11? –

+1

[n4296] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf) las redacciones son muy similares a C99: * Una lista de parámetros que consiste en un solo parámetro sin nombre del ** tipo vacío ** no dependiente es equivalente a una lista de parámetros vacía *. ¿Eso significa que la segunda declaración es válida según n4296 (y posiblemente C++ 11)? – Nawaz

+1

@Nawaz sí lo es –

0

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

18

gcc bugs . Editar: ya que no era lo suficientemente claro, lo que quise decir es que gcc 4.3.2 estaba compilando debido a errores. Ver #32364 y #9278.

+3

"gcc bugs" no es una respuesta mate –