-std=c99是否会阻止我的#includes正常工作?
我正在尝试在Linux系统上编译一个C程序。我有一个-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的基本原理)大喊大叫 考
#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的。我对这个答案唯一不满的是我相信定义应该放在源文件本身(任何源文件中的第一件事)中,而不是放在命令行中