¿Por qué es posible invocar una función declarada más adelante en C?

Tengo este pequeño código para demostrarlo:

#include "stdio.h" int main() { int a = testfunc(); // declared later printf("%d", a); return 0; } int testfunc() { return 1; } 

Se comstack sin error, y sale un 1 como se esperaba.

Ver en acción: http://ideone.com/WRF94E

¿Por qué no hay error? ¿Es parte de la especificación de C o una cosa relacionada con el comstackdor?

La función testfunc () se declara implícitamente. El comstackdor no puede realizar ninguna comprobación de firmas, por lo que puede obtener un error de tiempo de ejecución en caso de que no lo invoque correctamente.

Esto es parte de la especificación C Pero la recomendación en la especificación C es declarar todas las funciones que planea implementar y usar, al comienzo del archivo actual o en un archivo de encabezado.

Porque, por defecto, el comstackdor considera las funciones no declaradas como

 int function_name (); 

Internamente, una función no declarada se considera con el tipo de retorno como int y acepta cualquier número de argumentos. También coincide con su función real. así que no hay problema.

Esto es dependiente del comstackdor. Algunos comstackdores emitirán un error, otros – una advertencia, mientras que otros – nada. El deber del comstackdor es solo verificar que use la función con los argumentos correctos. Si no lo declara, entonces el comstackdor no puede verificar y advertirle por el mal uso de la función, pero puede generar el código para llamar a la función. El deber del enlazador, por otro lado, es ver que la función esté implementada y poner su dirección en la llamada generada previamente por el comstackdor. Dado que su función está implementada, el enlazador funciona bien.

Ya que su comstackdor no lo controla, puede intentar llamar a su función con argumentos. La llamada puede funcionar pero también puede hacer que su progtwig se bloquee.

 int a = testfunc(); int testfunc() { return 1; } 

No está recibiendo ningún error porque en C la firma de la función predeterminada es la misma.

Si desea que el comstackdor le diga que vea la demostración a continuación:

Llama así sin statement de reenvío y verás que el comstackdor te dará error.

 int a=testfunc(5.4); int testfunc(float f) { return 1; } 

NOTA: La mejor práctica en C es dar forward declaration de las funciones que usted utilizará en el progtwig.

El comstackdor no necesita ver una definición de función para llamarlo, solo necesita un prototipo para verificar los argumentos, si no hay alguno, el comstackdor asumirá que la función devuelve int y que usted sabe lo que está haciendo. Sin embargo, al vincular si el vinculador no puede resolver un símbolo solo, obtendrá un error.

En ANSI C, no tiene que declarar un prototipo de función; sin embargo, es una buena práctica usarlos. Si no tiene un prototipo y llama a una función, el comstackdor deducirá un prototipo de los parámetros que pase a la función. El comstackdor asume que tiene un tipo de retorno int. Si declara la función más adelante en la misma unidad de comstackción con un tipo de retorno diferente, obtendrá un error de comstackción.