Mon compilateur (GCC) me donne l'avertissement:
avertissement: déclaration implicite de fonction
S'il vous plaît, aidez-moi à comprendre pourquoi cela arrive.
Mon compilateur (GCC) me donne l'avertissement:
avertissement: déclaration implicite de fonction
S'il vous plaît, aidez-moi à comprendre pourquoi cela arrive.
Réponses:
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);
La bonne façon est de déclarer le prototype de fonction dans l'en-tête.
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
}
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.
Lorsque vous obtenez le, error: implicit declaration of function
il 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 functionname
et consulter la SYNOPSIS
section 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").
Si les en-têtes corrects sont définis et que vous utilisez une GlibC
bibliothèque non (comme Musl C ), elle gcc
lancera également des error: implicit declaration of function
extensions GNU telles que celles malloc_trim
rencontrées.
La solution consiste à envelopper l'extension et l'en-tête :
#if defined (__GLIBC__)
malloc_trim(0);
#endif
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.