Declaración de la función c

¿Es necesario declarar la función antes de usarla? ¿Da el comstackdor un error si no usamos una statement de función y la llamamos directamente? Por favor responda de acuerdo a la norma C.

En caso afirmativo, ¿qué significa que los argumentos de tipo se conviertan a int y que floten para duplicarse si los argumentos para funcionar no están definidos?

En ANSI C, no tiene que declarar un prototipo de función; sin embargo, es una buena práctica usarlos. La única razón por la que el estándar le permite no usarlos es por la compatibilidad con versiones anteriores de código muy antiguo.

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. Si declara la función más adelante en la misma unidad de comstackción, obtendrá un error de comstackción si la firma de la función es diferente de lo que el comstackdor supuso.

Peor aún, si la función está en otra unidad de comstackción, no hay forma de obtener un error de comstackción, ya que sin un prototipo no hay forma de verificarlo. En ese caso, si el comstackdor se equivoca, podría obtener un comportamiento indefinido si la llamada a la función inserta en la stack diferentes tipos de los que la función espera.

La convención es declarar siempre un prototipo en un archivo de encabezado que tenga el mismo nombre que el archivo fuente que contiene la función.

Con los prototipos, el comstackdor puede verificar que está llamando a la función correctamente (utilizando el número y el tipo de parámetros correctos).

Sin prototipos, es posible tener esto:

// file1.c void doit(double d) { .... } int sum(int a, int b, int c) { return a + b + c; } 

y esto:

 // file2.c // In C, this is just a declaration and not a prototype void doit(); int sum(); int main(int argc, char *argv[]) { char idea[] = "use prototypes!"; // without the prototype, the compiler will pass a char * // to a function that expects a double doit(idea); // and here without a prototype the compiler allows you to // call a function that is expecting three argument with just // one argument (in the calling function, args b and c will be // random junk) return sum(argc); } 

En C, necesitas definir todo antes de usarlo. Creo que la idea es que puede comstackr todo en un solo paso, ya que siempre tiene toda la información que necesita para cuando llega.

No estoy seguro de lo que estás preguntando con la segunda parte. Si la función no está definida, simplemente no funcionará.

La respuesta corta: en C89 / 90 no es necesario, en C99 es necesario.

En C89 / 90 la función no tiene que ser declarada para ser llamada. Para la función no declarada, el comstackdor realizará una suposición sobre el tipo de retorno de la función (se supone que int ) y sobre los tipos de parámetros de la función (los derivará de los tipos de argumento en el punto de la llamada).

En C99, la función tiene que ser declarada previamente para ser llamada. Tenga en cuenta que incluso en C99 no hay ningún requisito para proporcionar un prototipo para la función, solo se necesita una statement, es decir, una statement no prototipo está bien. Esto significa que el comstackdor ya no tiene que hacer suposiciones sobre el tipo de retorno de la función (ya que la statement siempre lo especifica explícitamente), pero podría tener que hacer suposiciones sobre los parámetros de la función (si la statement no es un prototipo).

El estándar C99 en 6.5.2.2 “Llamada de función” describe lo que sucede en una expresión de llamada de función, incluso si el comstackdor no ha visto ningún prototipo para la función:

Si la expresión que denota la función llamada tiene un tipo que no incluye un prototipo, las promociones de enteros se realizan en cada argumento, y los argumentos que tienen el tipo float se promueven al doble. Estos se llaman el argumento por defecto

Más adelante, describe lo que sucede si la expresión de llamada de función no coincide con la forma en que se define realmente la función:

Si la función se define con un tipo que no es compatible con el tipo (de la expresión) señalado por la expresión que denota la función llamada, el comportamiento no está definido.

Claramente, para ayudar a garantizar la corrección, el uso de prototipos de funciones es lo correcto. Suficiente para que C ++ hiciera que los prototipos de funciones fueran uno de los cambios de “ruptura” con c.