una tipos son prototipos prototipo los lenguaje función funciones funcion estructura declaracion cuales cual c gcc

tipos - declaración de función no es un prototipo



tipos de funciones en c (3)

Tengo una biblioteca que creé,

mylib.c:

#include <mylib.h> int testlib() { printf("Hello world/n"); return (0); }

mylib.h:

#include <stdio.h> extern int testlib();

En mi programa, he intentado llamar a esta función de biblioteca:

myprogram.c:

#include <mylib.h> int main (int argc, char *argv[]) { testlib(); return (0); }

Cuando intento compilar este programa, aparece el siguiente error:

In file included from myprogram.c:1 mylib.h:2 warning: function declaration isn''t a prototype

Estoy usando: gcc (GCC) 3.4.5 20051201 (Red Hat 3.4.5-2)

Mi pregunta es, ¿cuál es la forma correcta de declarar un prototipo de función?


En C int foo() e int foo(void) son funciones diferentes. int foo() acepta un número arbitrario de argumentos, mientras que int foo(void) acepta 0 argumentos. En C ++ significan lo mismo. Sugiero que use el void consistente cuando no tenga argumentos.

Si tiene una variable a , extern int a; es una forma de decirle al compilador que a es un símbolo que podría estar presente en una unidad de traducción diferente (el compilador de C habla por el archivo fuente), no lo resuelva hasta el momento del enlace. Por otro lado, los símbolos que son nombres de funciones se resuelven de todos modos en el tiempo del enlace. El significado de un especificador de clase de almacenamiento en una función ( extern , static ) solo afecta su visibilidad y extern es el predeterminado, por lo que extern es realmente innecesario.

Sugiero eliminar el extern , es extraño y por lo general se omite.


Respuesta rápida: cambie int testlib() a int testlib(void) para especificar que la función no toma argumentos.

Un prototipo es, por definición, una declaración de función que especifica el tipo (s) de argumento (s) de la función.

Una declaración de función no prototipo como

int foo();

es una declaración antigua que no especifica el número o tipos de argumentos. (Antes del estándar ANSI C de 1989, este era el único tipo de declaración de función disponible en el lenguaje.) Puede llamar a dicha función con cualquier número arbitrario de argumentos, y no es necesario que el compilador se queje, pero si el la llamada es inconsistente con la definición , su programa tiene un comportamiento indefinido.

Para una función que toma uno o más argumentos, puede especificar el tipo de cada argumento en la declaración:

int bar(int x, double y);

Las funciones sin argumentos son un caso especial. Lógicamente, los paréntesis vacíos habrían sido una buena manera de especificar un argumento, pero esa sintaxis ya estaba en uso para las declaraciones de funciones antiguas, por lo que el comité ANSI C inventó una nueva sintaxis usando la palabra clave void :

int foo(void); /* foo takes no arguments */

Una definición de función (que incluye código para lo que realmente hace la función) también proporciona una declaración . En tu caso, tienes algo similar a:

int testlib() { /* code that implements testlib */ }

Esto proporciona una declaración no prototipo para testlib . Como definición, esto le dice al compilador que testlib no tiene parámetros, pero como una declaración, solo le dice al compilador que testlib toma un número no especificado pero fijo y tipo (s) de argumentos.

Si cambia () a (void) la declaración se convierte en un prototipo.

La ventaja de un prototipo es que si accidentalmente llama a testlib con uno o más argumentos, el compilador diagnosticará el error.

(C ++ tiene reglas ligeramente diferentes. C ++ no tiene declaraciones de funciones antiguas, y los paréntesis vacíos significan específicamente que una función no toma argumentos. C ++ admite la sintaxis (void) para consistencia con C. Pero a menos que necesite específicamente su código para compila como C y como C ++, probablemente deberías usar el () en C ++ y la sintaxis (void) en C.


Tratar:

extern int testlib(void);