使用-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:
#包括
#包括
#包括
Myman 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
选项的使用。因为虽然您可以通过自己指定功能宏来诱使
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