Mon compilateur (GCC) me donne l'avertissement:
warning: déclaration implicite de fonction
S'il vous plaît, aidez-moi à comprendre pourquoi cela arrive.
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);
La bonne façon 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 fichier (main.c)
static int some_main(const char *name);
int some_main(const char *name)
{
// do something
}
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.
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").
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
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.