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.
@leppie: No sigo. ¿Por qué debería el compilador advertir sobre una llamada válida a una función? – Troubadour
Si agrega el indicador '-Wstrict-prototypes' a gcc, esto lo advertirá:' xc: 4: advertencia: declaración de función no es un prototipo' – caf
@caf: Thanks :) – leppie