Resposta rápida: altere int testlib()
para int testlib(void)
para especificar que a função não aceita argumentos.
Um protótipo é, por definição, uma declaração de função que especifica o (s) tipo (s) do (s) argumento (s) da função.
Uma declaração de função não protótipo como
int foo();
é uma declaração de estilo antigo que não especifica o número ou os tipos de argumentos. (Antes do padrão ANSI C de 1989, esse era o único tipo de declaração de função disponível no idioma.) Você pode chamar essa função com qualquer número arbitrário de argumentos, e o compilador não precisa se queixar - mas se o Se a chamada for inconsistente com a definição , seu programa tem um comportamento indefinido.
Para uma função que recebe um ou mais argumentos, você pode especificar o tipo de cada argumento na declaração:
int bar(int x, double y);
Funções sem argumentos são um caso especial. Logicamente, parênteses vazios teriam sido uma boa maneira de especificar esse argumento, mas essa sintaxe já estava sendo usada para declarações de função de estilo antigo; portanto, o comitê ANSI C inventou uma nova sintaxe usando a void
palavra-chave:
int foo(void); /* foo takes no arguments */
Uma definição de função (que inclui código para o que a função realmente faz) também fornece uma declaração . No seu caso, você tem algo semelhante a:
int testlib()
{
/* code that implements testlib */
}
Isso fornece uma declaração sem protótipo para testlib
. Como definição, isso informa ao compilador que testlib
não possui parâmetros, mas como declaração, ele diz apenas ao compilador que testlib
utiliza algum número e tipo (s) de argumentos não especificados, mas fixos.
Se você mudar ()
para (void)
a declaração, torna-se um protótipo.
A vantagem de um protótipo é que, se você chamar acidentalmente testlib
com um ou mais argumentos, o compilador diagnosticará o erro.
(O C ++ possui regras ligeiramente diferentes. O C ++ não possui declarações de função no estilo antigo, e parênteses vazios significam especificamente que uma função não aceita argumentos. O C ++ suporta a (void)
sintaxe da consistência com C. Mas, a menos que você precise especificamente do seu código para compilar os dois, C e como C ++, você provavelmente deve usar o ()
em C ++ e a (void)
sintaxe em C.)