Mon compilateur (GCC) me donne l'avertissement :
avertissement : déclaration implicite de la fonction
Aidez-moi à comprendre pourquoi cela se produit.
Mon compilateur (GCC) me donne l'avertissement :
avertissement : déclaration implicite de la fonction
Aidez-moi à comprendre pourquoi cela se produit.
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);
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.
Je ne peux pas exécuter le code après avoir reçu cet avertissement. Il se comporte donc comme une erreur.
La bonne méthode consiste à déclarer le prototype de la fonction dans l'en-tête.
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
}
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.
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 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.
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