2010-08-10 20 views

Respuesta

1

Ha, tuve el otro día.

Su definición debe ser:

void hello(void); 

Else la función puede aceptar cualquier número de parámetros.

Pero entiendo tu punto. Casi no hay compiladores que incluso den la menor advertencia al respecto.

+1

@leppie: No sigo. ¿Por qué debería el compilador advertir sobre una llamada válida a una función? – Troubadour

+3

Si agrega el indicador '-Wstrict-prototypes' a gcc, esto lo advertirá:' xc: 4: advertencia: declaración de función no es un prototipo' – caf

+0

@caf: Thanks :) – leppie

11

En C, void hello() declara una función que devuelve un hello()void y toma unspecified number of arguments.

Nota

En C++ su todos juntos un escenario diferente. void hello() en C++ declara una función que devuelve un hello()void y toma no arguments.

12

Porque:

void hello() { 

no quiere decir lo que usted piensa que lo hace. Use:

void hello(void) { 

Sin el vacío, usted está diciendo que no se puede tomar la molestia de especificar los parámetros. Tenga en cuenta que esta es una de las muchas formas en que C difiere de C++.

4

Según lo que puedo deducir de The C Book 4.2, su definición de función no es un prototipo, ya que no especifica ningún tipo de información para los argumentos. Esto significa que el compilador solo recuerda el tipo de devolución y no conserva ninguna información sobre los argumentos de ningún tipo.

Esta forma de definición todavía se permite para la compatibilidad hacia atrás y no se limita a las funciones que no toman ningún argumento. gcc permitirá igualmente algo como

void hello(a) { 
} 

int main(int argc, char* argv[]) { 
int test = 1234; 
hello(test,1); 

return 0; 
} 

Es solo la falta de información de tipo para los argumentos que es importante aquí. Para solucionar esto y asegurarse de que gcc verifique los argumentos cuando se utiliza la función, puede poner la información del tipo en una declaración de su función o la definición. Preferiblemente los pondrías en ambos.

Todo esto aún no responde su pregunta, por supuesto, sobre por qué gcc no lo advierte. Debe ser el caso que el equipo de gcc sienta que todavía hay suficiente código C de estilo antiguo para justificar la supresión de la advertencia por defecto. IMO Me sorprende que la opción -Wstrict-prototype mencionada por @caf no esté activada por defecto.

Cuestiones relacionadas