avertissement: déclaration implicite de fonction

201

Mon compilateur (GCC) me donne l'avertissement:

avertissement: déclaration implicite de fonction

S'il vous plaît, aidez-moi à comprendre pourquoi cela arrive.

Angus
la source
1
Un "pourquoi ne donne-t-il pas une version d'erreur": stackoverflow.com/questions/434763/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
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
kurdtpage

Réponses:

230

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

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, directement ou dans un en-tête:

int fun(int x, char *p);
cnicutar
la source
9
En complément si vous avez donné au prototype la vérification qu'il ne s'agit pas seulement d'une faute de frappe. De plus, si elle provient d'une bibliothèque externe, vérifiez que vous l'avez incluse.
smitec
1
Je ne peux pas exécuter le code après avoir reçu cet avertissement. Il se comporte donc comme une erreur.
Mien
@Flimm, C99 et C89 / C90 ont un réglage différent pour cela
How Chen
3
@Flimm stackoverflow.com/questions/434763/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@ZachSaw À juste titre. Sinon, vous ne vous seriez pas répété trois fois.
Nima Mousavi
19

La bonne façon est de déclarer le prototype de fonction dans l'en-tête.

Exemple

main.h

#ifndef MAIN_H
#define MAIN_H

int some_main(const char *name);

#endif

principal c

#include "main.h"

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

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

Alternative avec un fichier (main.c)

static int some_main(const char *name);

int some_main(const char *name)
{
    // do something
}
Faizal Pribadi
la source
7

Lorsque vous effectuez vos #includes dans main.c, placez la référence #include dans le fichier qui contient la fonction référencée en haut de la liste d'inclusion. Par exemple, dites que c'est main.c et que votre fonction référencée est 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 de "déclaration implicite de fonction", mais ci-dessous:

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

tomc
la source
3

Lorsque vous obtenez le, error: implicit declaration of functionil devrait également répertorier la fonction incriminée. Souvent, cette erreur se produit en raison d'un fichier d'en-tête oublié ou manquant, donc à l'invite du shell, vous pouvez taper man 2 functionnameet consulter la SYNOPSISsection en haut, car cette section répertorie tous les fichiers d'en-tête qui doivent être inclus. Ou essayez http://linux.die.net/man/ Ce sont les pages de manuel en ligne sur lesquelles ils sont hyperliés et faciles à rechercher. Les fonctions sont souvent définies dans les fichiers d'en-tête, y compris tout fichier 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 encore vu de déclaration ("prototype").

Dwayne
la source
2

Si les en-têtes corrects sont définis et que vous utilisez une GlibCbibliothèque non (comme Musl C ), elle gcclancera également des error: implicit declaration of functionextensions GNU telles que celles malloc_trimrencontrées.

La solution consiste à envelopper l'extension et l'en-tête :

#if defined (__GLIBC__)
  malloc_trim(0);
#endif
Stuart Cardall
la source
1

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

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

int main(void) {

   yourfunc();
 }
Poussy
la source
0

Je pense que la question n'est pas répondue à 100%. Je cherchais un problème avec le typeof () manquant, qui est la directive de temps de compilation.

Les liens suivants mettront en lumière la situation:

https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/Typeof.html

https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/Alternate-Keywords.html#Alternate-Keywords

à la suite d'une contrainte, essayez d'utiliser à la __typeof__()place. gcc ... -Dtypeof=__typeof__ ...Peut également aider.

Peeter Vois
la source