web-dev-qa-db-fra.com

Réception d'un avertissement "déclaration implicite de la fonction 'strlen'"

J'ai un code simple, mais je reçois un avertissement: 

-bash-3.2$ gcc -Wall print_process_environ.c -o p_p
print_process_environ.c: In function 'print_process_environ':
print_process_environ.c:24: warning: implicit declaration of function 'strlen'
print_process_environ.c:24: warning: incompatible implicit declaration of built-in function 'strlen'

Voici le code:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <strings.h>

    void
    print_process_environ(pid_t pid)
    {
        int     fd;
        char    filename[24];
        char    environ[1024];
        size_t  length;
        char    *next_var;

        snprintf(filename, sizeof(filename), "/proc/%d/environ", (int)pid);
        printf("length of filename: %d\n", strlen(filename));

        fd = open(filename, O_RDONLY);
......

La définition de strlen() est:

   #include <string.h>

   size_t strlen(const char *s);

comment se débarrasser de cet avertissement.

23
Joe.Z

c'est #include <string.h>. Vous l'orthographiez mal dans votre code. Aussi, si jamais vous recevez cet avertissement dans votre compilateur .. faites toujours man function_name sur le terminal pour voir l'en-tête requis pour cette fonction 

 #include <string.h> // correct header
 #include <strings.h> // incorrect header - change this in your code to string.h
37
sukhvir

Vous avez été piqué par une erreur facile, vous avez inclus l'en-tête posix strings.h

#include <strings.h>

au lieu de:

#include <string.h>

l'en-tête posix inclut la prise en charge de:

int    bcmp(const void *, const void *, size_t); (LEGACY )
void   bcopy(const void *, void *, size_t); (LEGACY )
void   bzero(void *, size_t); (LEGACY )
int    ffs(int);
char  *index(const char *, int); (LEGACY )
char  *rindex(const char *, int); (LEGACY )
int    strcasecmp(const char *, const char *);
int    strncasecmp(const char *, const char *, size_t);

qui sont toutes des fonctions non standard, ceci explique également le manque d'erreur, j'ai du mal à trouver une bonne référence mais BSD la version de systèmes de strings.h utilisé pour inclure également string.h.

7
Shafik Yaghmour

Il s'avère que le code était #include <stdlib.h> et que ma sortie était:

 enter image description here

Solution:

stdlib.h remplacé par stdio.h et l'avertissement est parti

En bref, le compilateur essaie de vous dire qu'il n'a pas pu trouver la déclaration d'une fonction. Ceci est le résultat de a). Aucun fichier d'en-tête inclus b) Nom de fichier d'en-tête incorrect.

0
peter