Respuesta rápida: cambie int testlib()
a int testlib(void)
para especificar que la función no requiere argumentos.
Un prototipo es, por definición, una declaración de función que especifica el (los) tipo (s) de argumento (s) de la función.
Una declaración de la función prototipo no como
int foo();
es una declaración de estilo antiguo que no especifica el número o el tipo 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, se puede especificar el tipo de cada argumento en la declaración:
int bar(int x, double y);
Funciones sin argumentos son un caso especial. Lógicamente, los paréntesis vacíos habría sido una buena manera de especificar que un argumento, sino que la sintaxis ya estaba en uso de declaraciones de funciones de estilo antiguo, por lo que el comité ANSI C inventado una nueva sintaxis utilizando el void
palabra clave:
int foo(void); /* foo takes no arguments */
Una función definición (que incluye código para lo que realmente hace la función) también proporciona una declaración . En su caso, usted tiene 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 al 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 la coherencia con C. Pero a menos que necesite específicamente su código para compilar ambos como C y como C++, probablemente debería usar el ()
en C++ y la sintaxis (void)
en C.)
Eliminar extern de la declaración en mylib.h Especialmente si está escribiendo un programa C puro, el externo la declaración es innecesaria allí. –