aviso: declaração implícita de função


201

Meu compilador (GCC) está me dando o aviso:

aviso: declaração implícita de função

Por favor, me ajude a entender por que está chegando.


1
Um "por que ele não fornece uma versão de erro": stackoverflow.com/questions/434763/…
Ciro Santilli #

Isso também pode acontecer se você esquecer de incluir um arquivo de cabeçalho. Por exemplo, se você está tentando usar strlen () sem incluir string.h você irá obter este erro
kurdtpage

Respostas:


230

Você está usando uma função para a qual o compilador ainda não viu uma declaração (" protótipo ").

Por exemplo:

int main()
{
    fun(2, "21"); /* The compiler has not seen the declaration. */       
    return 0;
}

int fun(int x, char *p)
{
    /* ... */
}

Você precisa declarar sua função antes de main, assim, diretamente ou em um cabeçalho:

int fun(int x, char *p);

9
Além disso, se você deu o protótipo, verifique se não é apenas um erro de digitação. Além disso, se for de uma biblioteca externa, verifique se você a incluiu.
smitec

1
Não consigo executar o código depois de receber este aviso. Portanto, ele se comporta como um erro.
Mien

@Flimm, C99 e C89 / C90 tem configurações diferentes para isso
Como Chen


1
@ZachSaw Com razão. Senão, você não se repetiria três vezes.
Nima Mousavi

19

O caminho certo é declarar protótipo de função no cabeçalho.

Exemplo

main.h

#ifndef MAIN_H
#define MAIN_H

int some_main(const char *name);

#endif

main.c

#include "main.h"

int main()
{
    some_main("Hello, World\n");
}

int some_main(const char *name)
{
    printf("%s", name);
}

Alternativa com um arquivo (main.c)

static int some_main(const char *name);

int some_main(const char *name)
{
    // do something
}

7

Quando você fizer suas #includes em main.c, coloque a referência #include no arquivo que contém a função referenciada na parte superior da lista de inclusão. por exemplo, diga que este é main.c e sua função referenciada está em "SSD1306_LCD.h"

#include "SSD1306_LCD.h"    
#include "system.h"        #include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <string.h>
#include <math.h>
#include <libpic30.h>       // http://microchip.wikidot.com/faq:74
#include <stdint.h>
#include <stdbool.h>
#include "GenericTypeDefs.h"  // This has the 'BYTE' type definition

O exemplo acima não gerará o erro "declaração implícita de função", mas abaixo o

#include "system.h"        
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <string.h>
#include <math.h>
#include <libpic30.h>       // http://microchip.wikidot.com/faq:74
#include <stdint.h>
#include <stdbool.h>
#include "GenericTypeDefs.h"     // This has the 'BYTE' type definition
#include "SSD1306_LCD.h"    

Exatamente a mesma #include list, apenas ordem diferente.

Bem, fez por mim.


3

Quando você obtém o error: implicit declaration of functionarquivo, também deve listar a função incorreta. Geralmente, esse erro ocorre devido a um arquivo de cabeçalho esquecido ou ausente, portanto, no prompt do shell, você pode digitar man 2 functionnamee olhar para a SYNOPSISseção na parte superior, pois esta seção listará todos os arquivos de cabeçalho que precisam ser incluídos. Ou tente http://linux.die.net/man/ Estas são as páginas de manual on-line, com links e fáceis de pesquisar. As funções são frequentemente definidas nos arquivos de cabeçalho, incluindo todos os arquivos de cabeçalho necessários. Como cnicutar disse,

Você está usando uma função para a qual o compilador ainda não viu uma declaração ("protótipo").


2

Se você tiver os cabeçalhos corretos definidos e estiver usando uma GlibCbiblioteca que não seja (como Musl C ) gcc, também será lançadaerror: implicit declaration of function quando extensões GNU como malloc_trimas encontradas.

A solução é agrupar a extensão e o cabeçalho :

#if defined (__GLIBC__)
  malloc_trim(0);
#endif

1

Você precisa declarar a função desejada antes da sua função principal :

#include <stdio.h>
int yourfunc(void);

int main(void) {

   yourfunc();
 }

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.