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.