web-dev-qa-db-fra.com

avertissement: déclaration implicite incompatible de la fonction intégrée «xyz»

Je reçois plusieurs de ces avertissements lors de la compilation de quelques fichiers binaires:

warning: incompatible implicit declaration of built-in function ‘strcpy’
warning: incompatible implicit declaration of built-in function ‘strlen’
warning: incompatible implicit declaration of built-in function ‘exit’

Pour essayer de résoudre cela, j'ai ajouté

#include <stdlib.h>

en haut des fichiers C associés à cet avertissement, en plus de la compilation avec les indicateurs suivants:

CFLAGS = -fno-builtin-exit -fno-builtin-strcat -fno-builtin-strncat -fno-builtin-strcpy -fno-builtin-strlen -fno-builtin-calloc

J'utilise GCC 4.1.2:

$ gcc --version
gcc (GCC) 4.1.2 20080704

Que dois-je faire pour résoudre ces avertissements?

155
Alex Reynolds

En C, utiliser une fonction non encore déclarée constitue une déclaration implicite de la fonction. Dans une déclaration implicite, le type de retour est int si je me souviens bien. Maintenant, GCC a des définitions intégrées pour certaines fonctions standard. Si une déclaration implicite ne correspond pas à la définition intégrée, vous obtenez cet avertissement.

Pour résoudre le problème, vous devez déclarer les fonctions avant de les utiliser. normalement vous faites cela en incluant l'en-tête approprié. Je recommande de ne pas utiliser les drapeaux -fno-builtin-* si possible.

Au lieu de stdlib.h, vous devriez essayer:

#include <string.h>

C'est là que strcpy et strncpy sont définis, au moins conformément à la page de manuel strcpy (2).

La fonction exit est définie dans stdlib.h, donc je ne sais pas ce qui se passe là-bas.

260
Ville Laurikari

Dans le cas de certains programmes, ces erreurs sont normales et ne doivent pas être corrigées.

Je reçois ces messages d'erreur lors de la compilation du programme phrap (par exemple). Ce programme contient du code qui modifie ou remplace certaines fonctions intégrées, et lorsque j'inclus les fichiers d'en-tête appropriés pour corriger les avertissements, GCC génère à la place un ensemble d'erreurs. Donc, corriger les avertissements casse efficacement la construction.

Si vous avez le code source dans le cadre d'une distribution qui devrait normalement être compilée, les erreurs peuvent être normales. Consultez la documentation pour vous en assurer.

16
Brandon

Voici un code C qui produit l'erreur mentionnée ci-dessus:

int main(int argc, char **argv) {
  exit(1);
}

Compilé comme ceci sur Fedora 17 Linux 64 bits avec gcc:

el@defiant ~/foo2 $ gcc -o n n2.c                                                               
n2.c: In function ‘main’:
n2.c:2:3: warning: incompatible implicit declaration of built-in 
function ‘exit’ [enabled by default]
el@defiant ~/foo2 $ ./n 
el@defiant ~/foo2 $ 

Pour que l'avertissement disparaisse, ajoutez cette déclaration en haut du fichier:

#include <stdlib.h>
11
Eric Leschinski

J'ai rencontré ces avertissements sur la fonction mempcpy. La page de manuel indique que cette fonction est une extension GNU et son résumé montre:

#define _GNU_SOURCE
#include <string.h>

Lorsque #define est ajouté à ma source avant le #include, les déclarations relatives aux extensions GNU sont rendues visibles et les avertissements disparaissent.

7
ajlittoz