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.
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
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.
Il s'avère que le code était #include <stdlib.h>
et que ma sortie était:
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.