接收警告“隐含声明功能'strlen'”

时间:2013-11-04 03:15:34

标签: c posix

我有一些简单的代码,但我收到了警告:

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

如何摆脱这种警告。

3 个答案:

答案 0 :(得分:38)

它是#include <string.h>。你在代码中拼错了。此外,如果您在编译器中收到警告..请始终在终端上执行man function_name以查看该功能所需的标头

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

答案 1 :(得分:7)

你被一个容易犯的错误所困扰,你加入了posix strings.h标题:

#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

答案 2 :(得分:0)

事实证明代码是stdlib.h,我的输出是:

enter image description here

解决方案:

stdio.h更改为{{1}}并且警告已消失

简而言之,编译器试图告诉你它无法找到函数的声明。这是a)的结果。没有包含头文件b)错误的头文件名.eg“sring.h”