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

Rav*_*mer 16 c linux gcc

我正在尝试在Linux系统上编译C程序.我有一份#include声明stdlib.h.

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

gcc -std=c99 -g -o progfoo progfoo.c progbar.c
Run Code Online (Sandbox Code Playgroud)

我收到警告Implicit declaration of function [srand48, drand48, bzero, or close].

编译为:

gcc -g -o progfoo progfoo.c progbar.c
Run Code Online (Sandbox Code Playgroud)

没有给我警告,但它确实对我使用for循环大喊大叫(这是-std=c99首先添加的理由).

考虑到man srand48提及,包括<stdlib.h>,我有,我不确定问题可能是什么.该for循环是没有什么必要的(他们只是为了节省时间在初始化数组的),所以我没有问题,删除它们,但我做之前,我想确认是否c99标准并取代我的一些方面#include的陈述.

我正在使用gcc 4.1.2-50 (Red Hat).

pax*_*blo 12

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

没有,但他们可能会出现在你的限制知识的他们是如何工作:-)


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

#if defined __USE_SVID || defined __USE_XOPEN
Run Code Online (Sandbox Code Playgroud)

因此,您可能必须明确设置其中一个宏.

但是,在尝试之前,请注意它不起作用.这是因为所有这些东西与控制gcc功能测试宏.

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

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

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

并且,对于bzeroclose,这些可以分别从strings.hunistd.h获得.

我一开始有点困惑,为什么这些编译与C99 -std=c99完全无关,但后来我意识到该标志只控制标准C头给你的东西.

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

  • +1,但实际上它们是宏,而不是变量. (2认同)
  • 对.知道当你编译没有`-std =`标志时,你要求`-std = gnu89`,这是C89加上GNU扩展 - 所以相当于这个模式的C99是`-std = gnu99 `. (2认同)

小智 6

看起来您使用的功能不是ISO C99,因此当您要求严格遵守C99时,它们将不可见.

信息:https://bugzilla.redhat.com/show_bug.cgi?id = 130815

国旗-D_POSIX_C_SOURCE=200809L应该工作.

另请参阅此问题:为什么在设置-std = c99时gcc不能找到random()接口?

  • 就像我必须在HelloWorld.c中为"printf"创建函数原型一样?我认为你不太了解我的问题. (2认同)