使用-std=c99的隐式声明

使用-std=c99的隐式声明,c,gcc,C,Gcc,我收到这个警告:(-std=c99-pedantic) 但我正在导入这些LIB: #include <stdio.h> #include <stdlib.h> #include <string.h> #包括 #包括 #包括 那又怎样( //file.c: #包括“file.h” strndup(…) //文件.h: #包括 #包括 #包括 Myman strndup说 Feature Test Macro Requirements for glibc (

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

但我正在导入这些LIB:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#包括
#包括
#包括
那又怎样(


//file.c:
#包括“file.h”
strndup(…)
//文件.h:
#包括
#包括
#包括

My
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 glibc的功能测试宏要求(参见功能测试宏(7)): strdup(): _SVID||||BSD|U源| | XOPEN|U源>=500|| _XOPEN\u源和扩展的XOPEN\u源 ||/*自glibc 2.12以来:**/_POSIX_C_SOURCE>=200809L strndup(): 自glibc 2.10以来: POSIX|C|U源>=200809L||U XOPEN|U源>=700 在glibc 2.10之前: _GNU_源 strdupa(),strndupa():_GNU_SOURCE 因此,我需要在第一个
#include

之前定义POSIX#U C#SOURCE 200809L
请参见
man 7 feature_test_macros
strndup
是一个GNU扩展,因此您需要在命令行上使用
-D_GNU SOURCE
进行编译,或者在
\include
行之前的源文件中粘贴一个
\define _gnusource 1
,问题在于您对
-std=c99
选项的使用。因为e> strndup()不是C99的一部分,您要求编译器进入标准兼容模式,它不会为它提供原型。当然,它仍然链接,因为您的C库中有它


虽然您可以通过自己指定功能宏来诱使
gcc
提供它,但我想说,处于C99兼容模式并请求GNU扩展没有多大意义。
gcc
已经为此提供了一种模式,它将解决您的警告:
-std=gnu99
这发生在我身上,并且我添加了
#define(定义)XOPEN(源代码500)
,警告消失了。

您能告诉我们如何调用strndup吗?它的调用方法包括不导入,这些是C头而不是libs。@mux:它的调用方式似乎很不相关,问题很可能是GCC没有使用指定的标志提供此函数声明(或在MinGW的情况下根本不存在).您的程序是否不顾警告链接?正如上面的两条评论所说,strndup在标题或libs@NiklasB.是的,你是对的,我认为上下文可能相关,抱歉。gnu99不是解决方案。定义正确的功能测试宏是解决方案。要使用POSIX中定义的接口,必须定义
\u POSIX\u C\u SOURCE
到所需的版本(200809L),然后再包括任何头文件(或者
\u XOPEN\u SOURCE
,如果您还需要完整的XSI选项)。我非常确定
strndup()
也不是POSIX。根据手册,它是一个GNU扩展。与其使用功能测试宏来启用它,为什么不直接使用
gnu99
模式呢?奥斯汀小组要求有所不同:至于为什么要用正确的方法来做,答案是它是可移植的。定义正确的功能测试宏将使您的程序在任何符合POSIX的系统上运行。使用“gnu99”将使您的程序在Linux+glibc上工作。实际上,
-std=gnu99
的目的主要是启用GNU C编译器扩展,它可以在GCC可用的任何地方工作,但是GNU libc特定的库扩展将不会普遍可用。有趣的是,感谢链接。您关于可移植性的论点是有意义的。我的主要观点是我想说的是,如果你打算使用GNU扩展功能,也可以一般地启用GNU扩展——但是,我的手册页似乎可以使用更新。我同意,如果我们只想访问该功能,那么这(即你所说的)可能是一个更好的解决方案。
// file.c:
    #include "file.h"
    strndup(...)
// file.h:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
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