2008-09-09 14 views

Respuesta

263

En C:

  • void foo() significa "una función foo teniendo un número indeterminado de argumentos de tipo no especificado"
  • void foo(void) significa "una función foo sin argumentos"

En C++:

  • void foo() significa "una función foo sin argumentos"
  • void foo(void) significa "una función foo sin argumentos"

Al escribir foo(void), por lo tanto, alcanzamos la misma interpretación en ambos idiomas y hacer que nuestros encabezados sean multilingües (aunque por lo general necesitamos hacer algunas cosas más en los encabezados para que sean verdaderamente de otro idioma; es decir, envuélvalos en un extern "C" si estamos compilando C++).

+4

Pero si C++ hubiera requerido el 'vacío', entonces podría haber evitado el problema de" analizar más molesto ". –

+4

Cierto, pero hay tantos otros parrafagos en C++ que no hay ningún punto real en lo que se refiere a alguno de ellos. – DrPizza

+9

En una pregunta reciente, @James Kanze publicó un mensaje interesante. Volver a publicar aquí para evitar perderlo: las primeras versiones de C no permitían especificar el número de parámetros que una función podría tomar, por lo que 'void foo()' era la única sintaxis para declarar una función. Cuando se introdujeron las firmas, el comité C tuvo que eliminar la ambigüedad del no-parámetro de la sintaxis antigua e introdujo la sintaxis 'void foo (void)'. C++ lo tomó por el bien de la compatibilidad. –

1

En C, utiliza un vacío en una referencia de función vacía para que el compilador tenga un prototipo y ese prototipo no tenga "ningún argumento". En C++, no tienes que decirle al compilador que tienes un prototipo porque no puedes dejar de lado el prototipo.

+1

"prototipo" se refiere a la declaración de lista de argumentos y tipo de retorno. Digo esto porque el "prototipo" me confundió al principio. –

31

que se dan cuenta de que su pregunta se refiere a C++, pero cuando se trata de la respuesta C se pueden encontrar en K & R, páginas 72-73:

Por otra parte, si una declaración de función no incluye argumentos, como en

double atof(); 

que también se toma en el sentido de que no hay nada que suponer sobre los argumentos de atof; toda verificación de parámetros está desactivada. Este significado especial de de la lista de argumentos vacíos está destinado a permitir que los programas anteriores C compilen con compiladores nuevos. Pero es una mala idea usarlo con nuevos programas. Si la función toma argumentos, declarelos; si no requiere argumentos, use void.

4

C++ 11 N3337 proyecto de norma

No hay diferencia.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

Anexo C "compatibilidad" C.1.7 Cláusula 8: declaradores dice:

8.3.5 Cambio: En C++, una función declarada con una lista de parámetros vacía no contiene argumentos. En C, una lista de parámetros vacía significa que el número y el tipo de los argumentos de la función son desconocidos.

Ejemplo:

int f(); 
// means int f(void) in C++ 
// int f(unknown) in C 

Justificación: Esto es para evitar llamadas a funciones erróneas (es decir, llamadas de función con un número equivocado o el tipo de argumentos).

Efecto en la función original: cambiar a la semántica de la función bien definida. Esta característica se ha marcado como “obsoleto” en C.

8.5.3 funciones dice:

4. El-declaración-cláusula parámetro determina los argumentos que se pueden especificar, y su procesamiento , cuando se llama a la función. [...] 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.

C99

Como se ha mencionado por C++ 11, int f() especifica nada acerca de los argumentos, y es obsoleta.

Puede conducir al código de trabajo o al UB.

que han interpretado la norma C99 en detalle en: https://stackoverflow.com/a/36292431/895245

+0

Su último enlace aquí es incorrecto; has vinculado a la respuesta eliminada de otra persona sobre una pregunta sobre C# y XML. –

+0

@MarkAmery gracias, lo arregló. Le faltaba un dígito. –

Cuestiones relacionadas