2010-03-11 18 views

Respuesta

11

En C99 debería dar un error de función no declarada error.

En C89/90 declarar funciones no es obligatorio. Si se invoca una función no declarada, el compilador asumirá que devuelve int y le pasará argumentos después de someterlos a las llamadas promociones por argumento predeterminadas. En otras palabras, el compilador intentará deducir cuál es esa función de la llamada real. Si más tarde la función se define de forma diferente a la que dedujo el compilador, el comportamiento no está definido. Normalmente los compiladores se quejarán con una advertencia.

Esto es lo que observa en su caso. Cuando el compilador ve la llamada prn(e) asume que prn es la función int prn(int). Pero luego descubre que en realidad es void prn(double, int). La falta de coincidencia está causando la advertencia.

En este caso, tiene suerte en el sentido de que la llamada a la función no declarada se realiza en la misma unidad de traducción donde se define la función. Entonces el compilador tiene la oportunidad de comparar la llamada y la definición y emitir una advertencia sobre el conflicto. Si se definió prn en alguna otra unidad de traducción, el compilador nunca tendría la oportunidad de comparar los dos, por lo que tendría un comportamiento indefinido completo en sus manos.

6

C89 tiene declaraciones de funciones implícitas. Si usa una función sin declararla, el compilador asume que es int prn(). Cuando esto resulta ser incorrecto (porque los tipos de devolución difieren), te lo está diciendo.

Tenga en cuenta que la lista de argumentos vacíos en una declaración de función significa "parámetros no especificados", no "sin parámetros". Entonces es su responsabilidad asegurarse de que los parámetros de entrada coincidan entre la persona que llama y la persona que llama (que no es así, aquí), y es posible que no obtenga ninguna ayuda del compilador con eso.

En C99 esta "función" se eliminó. Creo que solo fue realmente en C89 por compatibilidad con el antiguo código C. Hubo un tiempo en que C no tenía prototipos de funciones, siempre solo tenías que hacerlo por tu cuenta.

Cuestiones relacionadas