web-dev-qa-db-fra.com

warning: déclaration implicite de fonction

Mon compilateur (GCC) me donne l'avertissement:

warning: déclaration implicite de fonction

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

168
Angus

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

int fun(int x, char *p);
199
cnicutar

La bonne façon 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 fichier (main.c)

static int some_main(const char *name);

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

Lorsque vous effectuez votre #includes dans main.c, placez la référence #include au fichier contenant 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 "Déclaration implicite de la fonction", mais ci-dessous will-

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

7
tomc

Lorsque vous obtenez le error: implicit declaration of function, il devrait également répertorier la fonction incriminée. Cette erreur se produit souvent à cause d'un fichier d'en-tête oublié ou manquant. Vous pouvez donc taper man 2 functionname à l'invite du shell et consulter la section SYNOPSIS en haut, car cette liste répertorie tous les fichiers d'en-tête nécessitant pour être inclus. Ou essayez http://linux.die.net/man/ C'est la page de manuel en ligne sur laquelle ils sont en hyperlien et facile à rechercher. Les fonctions sont souvent définies dans les fichiers d'en-tête, y compris tous les fichiers d'en-tête requis constituent souvent la réponse. Comme dit Cnicutar,

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

3
Dwayne

Si vous avez les bons en-têtes définis et utilisez une bibliothèque non GlibC (telle que Musl C ) gcc lancera également error: implicit declaration of function lorsque GNU extensions telles que malloc_trim sont rencontrées.

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

#if defined (__GLIBC__)
  malloc_trim(0);
#endif
2
Stuart Cardall

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

Les liens suivants éclaireront 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

dès que vous êtes essuyé, essayez d'utiliser __typeof__() à la place. Aussi gcc ... -Dtypeof=__typeof__ ... peut vous aider.

0
Peeter Vois