2011-09-14 9 views
29

que he visto métodos con la siguiente firma:¿Por qué añadir a vacío método de lista de parámetros

void foo (void); 

se abstengan de argumento, sin embargo me pregunto si hacer esto es útil o no. ¿Hay alguna razón por la que te gustaría hacerlo?

+1

duplicado http://stackoverflow.com/questions/51032/is-there-a-difference-between-foovoid-and-foo-in-c-or-c –

+0

@nabulke Leí esa explicación hace meses mientras estaba pasando por un parashift, supongo que lo olvidé :) –

+2

Uno puede preguntarse por qué los constructores/destructores autogenerados incluso en _Visual Studio 2010_ seguirán dando como resultado este código: 'CClassname (void)' y '~ CClassname (void)' – nabulke

Respuesta

15

El estándar de C++ 03 dice (el énfasis es mío):

8.3.5.2

El parámetro -declaration-clause determina los argumentos que pueden ser especificados, y su procesamiento, cuando se llama a la función. [Nota: la cláusula-declaración-parámetro se utiliza para convertir los argumentos especificados en la llamada a la función; ver 5.2.2. ] Si la parameter-declaration-clause está vacía, la función no requiere argumentos.

Esto significa que si está hablando con el compilador es solo cuestión de gustos.

Si está escribiendo código que será leído por otros, entonces la forma en C++ de hacer las cosas es

void foo(); 

La otra forma es válida sólo por razones de compatibilidad con C, donde hay era una diferencia entre las dos firmas.

+0

@DavidHeffernan: ¿No es "una cuestión de gusto" responder eso implícitamente? Tenga en cuenta que solo estoy tomando el código C++ "fresco" en cuenta y no el código que solía ser C en el pasado pero que fue portado, en cuyo caso "porque nadie se molestó en cambiarlo a la manera moderna" podría ser una respuesta. – Jon

+1

@DavidHeffernan: Puedo ver el valor en eso, así que hice una edición en ese sentido. Gracias por su aporte. – Jon

3

Esta es una herencia de las versiones más antiguas de C para funciones sin argumentos

50

Esto es un remanente de versiones anteriores de C, donde foo() significaba "una función con un número desconocido de parámetros" y foo(void) significa "una función con cero parámetros". En C++, foo() y foo(void) ambos significan "una función con cero parámetros", pero algunas personas prefieren la segunda forma porque es más explícita.

+6

No son solo versiones anteriores de C.En todas las versiones de C comenzando con el estándar ANSI de 1989, 'void foo (void);' significa que foo no tiene parámetros, y 'voi foo();' significa que foo tiene un número fijo pero no especificado y tipo (s) de parámetros. C++ acepta la misma sintaxis para compatibilidad con C. –

+17

Más precisamente: en versiones "antiguas" (leer "muy antiguas") de C, 'foo()' era la única forma de declarar una función, y no había verificación de la número o tipos de argumentos Cuando C adoptó los prototipos de funciones de C++, hubo un problema de compatibilidad con versiones anteriores con 'f()' (ya que en C++ no significaba ningún parámetro, ya que no decía nada sobre los parámetros en C). El comité de estándares de C inventó 'f (void)' como una solución alternativa para esto, y el comité C++ lo adoptó por razones de compatibilidad C. –

+0

@James: Creo que quisiste decir que el comité de normas * C * lo inventó. –

3

En el código C++ no hay ninguna razón para usar el vacío de esta manera. Además, no es la forma idiomática de declarar funciones sin parámetros.

+0

Puede ser útil si un archivo está diseñado para que pueda compilarse como C o C++, creo. ... No puedo pensar en ninguna razón si esta no es la intención, pensó. –

Cuestiones relacionadas