Подтвердить что ты не робот

Получение предупреждения "неявное объявление функции" strlen ""

У меня есть простой код, но я получаю предупреждение:

-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'

Ниже приведен код:

#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);
......

Определение strlen():

   #include <string.h>

   size_t strlen(const char *s);

как избавиться от этого предупреждения.

4b9b3361

Ответ 1

it #include <string.h>. Вы ошибаетесь в своем коде. Также, если вы когда-нибудь получите это предупреждение в своем компиляторе.. всегда делайте man function_name на терминале, чтобы увидеть заголовок, необходимый для этой функции

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

Ответ 2

Вы были укушены легко ошибиться, вы включили posix strings.h header:

#include <strings.h>

вместо:

#include <string.h>

заголовок posix включает поддержку:

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);

которые являются нестандартными функциями, это также объясняет отсутствие ошибки, мне трудно найти хорошую ссылку, но версия BSD-систем strings.h также включает строку string.h.

Ответ 3

Я знаю, что этот QA довольно старый, но я просто подумал, что это поможет кому-то, кто сталкивается с этой проблемой. Я делал старый пример C некоторого кода. Я компилировал с gcc 4. *. Так получилось, что код был #include <stdlib.h>, и мой результат был:

введите описание изображения здесь

Решение:

Изменено stdlib.h до stdio.h, и предупреждение не прошло