可以-std = c99阻止我的#includes正常工作吗?

我正在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

不给我警告,但是对于我使用for循环(这是首先添加-std = c99的理由),我们一直在大声疾呼.

鉴于man srand48提到包括< stdlib.h>我有,我不知道还有什么问题可以. for循环对于任何东西都不是必需的(它们只是为了节省初始化数组的时间),所以我删除它们没有任何问题,但在我想确认c99标准是否取代了我的#包括语句.

我使用gcc 4.1.2-50(红帽).

Can -std=c99 prevent my #includes from working properly?

不,但是他们可能会显示出你对如何工作的了解的限制:-)

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

#if defined __USE_SVID || defined __USE_XOPEN

所以你可能必须明确地设置其中的一个宏.

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

有一套非常复杂的规则用于在features.h中设置或关闭特定功能,并且在此处创建的宏控制头文件包含和排除的内容. __USE_ *变体根据您自己提供的其他宏清除并设置在该头文件中.

例如,要使__USE_SVID设置为可以使用srand48,您需要为编译器提供-D_SVID_SOURCE参数.

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

而且,对于bzero和close,这些可以分别从strings.h和unistd.h获得.

首先我有点混淆,为什么这些编译与-std = c99当它们与C99绝对无关,但后来我意识到标志只能控制标准的C头给你什么.

没有string.h(注意复数名称,这不是string.h)也不是unistd.h是ISO C的一部分.

翻译自:https://stackoverflow.com/questions/4893382/can-std-c99-prevent-my-includes-from-working-properly

转载注明原文:可以-std = c99阻止我的#includes正常工作吗?