使用-std = c99的隐式声明

时间:2012-02-06 22:16:28

标签: c gcc

我收到此警告:(-std=c99 -pedantic

warning: implicit declaration of function ‘strndup’ [-Wimplicit-function-declaration]

但我正在导入这些库:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

那又怎样?! :(


// file.c:
    #include "file.h"
    strndup(...)
// file.h:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

4 个答案:

答案 0 :(得分:29)

问题在于您使用-std=c99选项。由于strndup() 不是 C99的一部分,并且您要求编译器进入符合标准的模式,因此它不会为其提供原型。当然它仍然是链接,因为你的C库有它。

虽然您可以通过自己指定功能宏来哄骗gcc来提供它,但我认为处于C99合规模式时没有多大意义例如,对于GNU扩展。 gcc已经为此提供了一种模式,可以解决您的警告:-std=gnu99

答案 1 :(得分:8)

我的man strndup

Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       strdup():
           _SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500 ||
           _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
           || /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
       strndup():
           Since glibc 2.10:
               POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700
           Before glibc 2.10:
               _GNU_SOURCE
       strdupa(), strndupa(): _GNU_SOURCE

所以我需要,例如#define POSIX_C_SOURCE 200809L 之前第一个#include
man 7 feature_test_macros

答案 2 :(得分:6)

strndup是GNU扩展,因此您需要在命令行上使用-D_GNU_SOURCE进行编译,或者在#define _GNU_SOURCE 1行之前将#include粘贴到源文件中/ p>

答案 3 :(得分:1)

这件事发生在我身上,我添加了#define _XOPEN_SOURCE 500并且警告消失了。