Respuesta rápida: cambie int testlib()
a int testlib(void)
para especificar que la función no acepta argumentos.
Un prototipo es, por definición, una declaración de función que especifica el tipo (s) de los argumentos de la función.
Una declaración de función no prototipo como
int foo();
es una declaración de estilo antiguo que no especifica el número o los 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 tal función con cualquier número arbitrario de argumentos, y el compilador no está obligado a quejarse, 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 forma de especificar que un argumento pero esa sintaxis ya estaba en uso para las declaraciones de funciones de estilo antiguo, por lo que el comité ANSI C inventó una nueva sintaxis usando la void
palabra clave:
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 su caso, tiene algo similar a:
int testlib()
{
/* code that implements testlib */
}
Esto proporciona una declaración de 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 algunos números y tipos de argumentos no especificados pero fijos.
Si cambia ()
a (void)
la declaración se convierte en un prototipo.
La ventaja de un prototipo es que si llama accidentalmente testlib
con uno o más argumentos, el compilador diagnosticará el error.
(C ++ tiene reglas ligeramente diferentes. C ++ no tiene declaraciones de funciones de estilo antiguo, y los paréntesis vacíos significan específicamente que una función no tiene argumentos. C ++ admite la (void)
sintaxis para mantener 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 ()
en C ++ y la (void)
sintaxis en C.)