285 votes

avertissement : déclaration implicite de la fonction

Mon compilateur (GCC) me donne l'avertissement :

avertissement : déclaration implicite de la fonction

Aidez-moi à comprendre pourquoi cela se produit.

3 votes

Un "pourquoi ne donne-t-il pas une version d'erreur" : stackoverflow.com/questions/434763/

2 votes

Cela peut également se produire si vous oubliez d'inclure un fichier d'en-tête. Par exemple, si vous essayez d'utiliser strlen() sans inclure string.h, vous obtiendrez cette erreur

316voto

cnicutar Points 98451

Vous utilisez une fonction pour laquelle le compilateur n'a pas vu de déclaration (" prototype ") encore.

Par exemple :

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

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

Vous devez déclarer votre fonction avant main, comme ceci, soit directement, soit dans un en-tête :

int fun(int x, char *p);

11 votes

En outre, si vous avez donné le prototype, vérifiez qu'il ne s'agit pas d'une simple erreur de frappe. De même, s'il provient d'une bibliothèque externe, vérifiez que vous l'avez inclus.

1 votes

Je ne peux pas exécuter le code après avoir reçu cet avertissement. Il se comporte donc comme une erreur.

1 votes

@Flimm, C99 et C89/C90 a des paramètres différents pour cela

33voto

Faizal Pribadi Points 214

La bonne méthode consiste à déclarer le prototype de la fonction dans l'en-tête.

Exemple

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);
}

Alternative avec un seul fichier (main.c)

static int some_main(const char *name);

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

12voto

tomc Points 81

Lorsque vous faites vos #includes dans main.c, mettez la référence #include au fichier qui contient la fonction référencée en haut de la liste d'inclusion. Par exemple, disons que c'est main.c et que la fonction référencée se trouve dans "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

Ce qui précède ne générera pas l'erreur "déclaration implicite de la fonction", mais ce qui suit le fera

#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"    

Exactement la même liste #include, juste un ordre différent.

Eh bien, ça l'a fait pour moi.

4voto

Poussy Points 37

Vous devez déclarer la fonction souhaitée avant votre principal fonction :

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

int main(void) {

   yourfunc();
 }

3voto

Dwayne Points 41

Lorsque vous obtenez le error: implicit declaration of function il devrait également lister la fonction incriminée. Souvent, cette erreur se produit à cause d'un fichier d'en-tête oublié ou manquant, donc à l'invite du shell vous pouvez taper man 2 functionname et regardez le SYNOPSIS en haut de la page, car cette section énumère tous les fichiers d'en-tête qui doivent être inclus. Ou essayez http://linux.die.net/man/ Il s'agit des pages de manuel en ligne ; elles sont hyperliées et faciles à rechercher. Les fonctions sont souvent définies dans les fichiers d'en-tête, inclure tous les fichiers d'en-tête requis est souvent la réponse. Comme l'a dit cnicutar,

Vous utilisez une fonction pour laquelle le compilateur n'a pas vu une déclaration ("prototype").

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X