web-dev-qa-db-ja.com

警告「関数 '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);
_

この警告を取り除く方法。

24
Joe.Z

#include <string.h>。コードのつづりが間違っています。また、コンパイラで警告が表示された場合は、常にman function_name端末で、その機能に必要なヘッダーを確認します

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

間違いを犯しやすいため、 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

7
Shafik Yaghmour

コードは#include <stdlib.h>と私の出力は次のとおりでした。

enter image description here

溶液:

かわった stdlib.hからstdio.hそして警告は消えました

要するに、コンパイラーは、関数の宣言を見つけることができなかったことを伝えようとしています。これは、a)の結果です。 b)間違ったヘッダーファイル名.eg "sring.h"

0
peter