Pergunta

Eu tenho uma biblioteca que criei,

minhalib.c:

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

minhalib.h:

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

No meu programa, tentei chamar esta função de biblioteca:

meuprograma.c:

#include <mylib.h>

int
main (int argc, char *argv[]) {
    testlib();
    return (0);
}

Quando tento compilar este programa recebo o seguinte erro:

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

Estou a usar: gcc (GCC) 3.4.5 20051201 (Red Hat 3.4.5-2)

Minha pergunta é: qual é a maneira correta de declarar um protótipo de função?

Foi útil?

Solução

Em C int foo() e int foo(void) são funções diferentes. int foo() aceita um número arbitrário de argumentos, enquanto int foo(void) aceita 0 argumentos.Em C++ eles significam a mesma coisa.Eu sugiro que você use void consistentemente quando você quer dizer sem argumentos.

Se você tiver uma variável a, extern int a; é uma maneira de dizer ao compilador que a é um símbolo que pode estar presente em uma unidade de tradução diferente (compilador C fala de arquivo de origem), não resolva até o momento do link.Por outro lado, os símbolos que são nomes de funções são resolvidos de qualquer maneira no momento do link.O significado de um especificador de classe de armazenamento em uma função (extern, static) afeta apenas sua visibilidade e extern é o padrão, então extern é realmente desnecessário.

Sugiro remover o extern, é estranho e geralmente omitido.

Outras dicas

Resposta rápida:mudar int testlib() para int testlib(void) para especificar que a função não aceita argumentos.

A 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 tipos de argumentos.(Antes do padrão ANSI C de 1989, este era o único tipo de declaração de função disponível na linguagem.) Você pode chamar tal função com qualquer número arbitrário de argumentos, e o compilador não é obrigado a reclamar - mas se o chamada é inconsistente com o definição, seu programa tem comportamento indefinido.

Para uma função que aceita 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 um argumento, mas essa sintaxe já estava em uso para declarações de função no estilo antigo, então o comitê ANSI C inventou uma nova sintaxe usando o void palavra-chave:

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

Uma função definiçã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 não-protótipo para testlib.Como definição, isso informa ao compilador que testlib não tem parâmetros, mas como declaração, apenas informa ao compilador que testlib leva alguns números e tipos de argumentos não especificados, mas fixos.

Se você mudar () para (void) a declaração se torna 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.

(C++ tem regras ligeiramente diferentes.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.C++ suporta o (void) sintaxe para consistência com C.Mas, a menos que você precise especificamente que seu código seja compilado como C e como C++, você provavelmente deve usar o () em C++ e o (void) sintaxe em C.)

Tentar:

extern int testlib(void);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top