Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
-std=c99是否会阻止我的#includes正常工作?_C_Linux_Gcc - Fatal编程技术网

-std=c99是否会阻止我的#includes正常工作?

-std=c99是否会阻止我的#includes正常工作?,c,linux,gcc,C,Linux,Gcc,我正在尝试在Linux系统上编译一个C程序。我有一个#include语句,用于stdlib.h 当我用gcc编译程序时,如下所示: gcc -std=c99 -g -o progfoo progfoo.c progbar.c 我收到关于函数[srand48、drand48、bzero或close]的隐式声明的警告。 改为编译为: gcc -g -o progfoo progfoo.c progbar.c 没有给我警告,但它确实对我使用进行循环(这是添加-std=c99的基本原理)大喊大叫 考

我正在尝试在Linux系统上编译一个C程序。我有一个
#include
语句,用于
stdlib.h

当我用
gcc
编译程序时,如下所示:

gcc -std=c99 -g -o progfoo progfoo.c progbar.c
我收到关于函数[srand48、drand48、bzero或close]的
隐式声明的警告。

改为编译为:

gcc -g -o progfoo progfoo.c progbar.c
没有给我警告,但它确实对我使用<代码>进行<代码>循环(这是添加
-std=c99
的基本原理)大喊大叫

考虑到
人srand48
提到了包括
,我不确定还有什么问题。
for
循环对任何事情都不是必需的(它们只是为了节省初始化数组的时间),因此我可以毫无问题地删除它们,但在删除之前,我想确认
c99
标准是否正在取代我的
\include
语句的某些方面


我使用的是
gcc4.1.2-50(Red Hat)

看起来您使用的函数不是ISO C99,所以当您请求 严格遵守C99,它们将不可见

资料如下:


标志
-D_POSIX_C_SOURCE=200809L
应该起作用

另请参见此问题:

隐式声明(假定未声明的函数返回int)在C99中不再允许

也就是说,gcc不会中止编译

尝试将
strings.h
包含在
bzero
中,另请参见paxdiablo的答案

-std=c99是否会阻止我的#includes正常工作

不,但它们可能会显示出您对它们如何工作的了解的局限性:-)


虽然函数
[sd]rand48
stdlib.h
中有一个原型,但它们在
#ifdef
中,至少在我的系统上是这样的:

#if defined __USE_SVID || defined __USE_XOPEN
因此,您可能需要显式设置其中一个宏

但是,在您尝试之前,请注意它不起作用。这是因为所有这些东西都是由
gcc
控制的

features.h
中,有一组非常复杂的规则用于设置特定功能的打开或关闭,在那里创建的宏控制头文件包含和排除的内容。
\uuu\u使用*
变体将根据您自己提供的其他宏在该头文件中清除和设置

例如,要获得
\u USE\u SVID
集以便可以使用
srand48
,需要向编译器提供
-D\u SVID\u SOURCE
参数

但也许更简单的方法是将C99和GNU扩展一起使用。为此,请将
-std=c99
替换为
-std=gnu99

对于
bzero
close
,它们可以分别从
strings.h
unistd.h
中获得

一开始我有点困惑,为什么这些文件是用
-std=c99
编译的,而它们与c99完全无关,但后来我意识到,flag只控制标准C头文件提供的内容


strings.h
(注意复数名称,这不是
string.h
)或
unistd.h
都不是ISO C的一部分。

您收到的错误听起来像是您使用的函数没有被声明。您确定为它们包含了正确的标题吗


此外,使用
-std=c99
可能会禁用一些不属于标准的扩展。您提到的函数都不是C标准的一部分。如果找不到单独的头,可以尝试
-std=gnu99

-std=c99
使头忽略任何可能与c99保留命名空间之外的名称使用冲突的内容,包括所有标准POSIX函数。请求提供给POSIX接口的头的可移植方法是将
\u POSIX\u C_SOURCE
定义为与所需POSIX版本相对应的值。对于最新的POSIX(2008),这意味着:

#define _POSIX_C_SOURCE 200809L
或在命令行上:

-D_POSIX_C_SOURCE=200809L

编辑:您想要的函数似乎不在POSIX库中,而是在XSI选项中,因此您应该将
\u XOPEN\u SOURCE
定义为适当的值(
700
是最新的)来获取它们。这也可以从命令行或源文件中完成(但如果是从源文件中,则必须在包含任何系统头之前执行

您要求符合标准,并且没有将
srand48()
定义为
提供的函数

对于GNU C库,您可以通过定义
/usr/include/features.h
顶部注释中列出的一个或多个选项来请求附加功能,或者在
\include
之前通过
\define
或将
-D
标记添加到
gcc

对于
srand48()
(和
drand48()
),您可能需要
-D\u XOPEN\u SOURCE=500
-D\u SVID\u SOURCE
(或
在源文件中定义\u XOPEN\u SOURCE 500
等)


bzero()
close()
应该可以与
-std=c99
一起工作,如果
#包含它们的文件头文件,它们分别是

就像我必须为“printf”制作一个函数原型一样在HelloWorld.c中?我想你不太理解我的问题。他收到了关于系统包含文件(stdlib.h)的警告如果我理解正确,不是在他自己的代码中。对不起,我没有意识到这些函数不是自己编写的,因为我只写C99代码,从来没有使用过它们。编辑了我的答案。
-D_POSIX_C_SOURCE=200809L
是正确的便携式方法。
-D_GNU_SOURCE
是glibc-specific的。我对这个答案唯一不满的是我相信定义应该放在源文件本身(任何源文件中的第一件事)中,而不是放在命令行中