我正在尝试在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.
并且,对于bzero和close,这些可以分别从strings.h和unistd.h获得.
我一开始有点困惑,为什么这些编译与C99 -std=c99完全无关,但后来我意识到该标志只控制标准C头给你的东西.
两者strings.h(注意复数名称,这不是 string.h)也不unistd.h是ISO C的一部分.
小智 6
看起来您使用的功能不是ISO C99,因此当您要求严格遵守C99时,它们将不可见.
信息:https://bugzilla.redhat.com/show_bug.cgi?id = 130815
国旗-D_POSIX_C_SOURCE=200809L应该工作.
另请参阅此问题:为什么在设置-std = c99时gcc不能找到random()接口?
| 归档时间: |
|
| 查看次数: |
3644 次 |
| 最近记录: |