我正在尝试在Linux系统上编译C程序。我有#include
的{{1}}声明。
当我使用stdlib.h
编译程序时,如下所示:
gcc
我收到有关gcc -std=c99 -g -o progfoo progfoo.c progbar.c
的警告。
编译为:
Implicit declaration of function [srand48, drand48, bzero, or close]
没有给我警告,但它对我使用gcc -g -o progfoo progfoo.c progbar.c
循环(这是首先添加for
的理由)大喊大叫。
鉴于我-std=c99
提到了包括man srand48
在内的<stdlib.h>
,我不确定问题可能是什么。 for
循环对于任何事情都不是必不可少的(它们只是为了节省初始化数组的时间)所以我删除它们没有问题,但在此之前我想确认是否c99
标准正在取代我的#include
陈述的某些方面。
我正在使用gcc 4.1.2-50 (Red Hat)
。
答案 0 :(得分:12)
-std = c99可以阻止我的#include正常工作吗?
不,但他们可能会在知识中显示出工作方式的限制: - )
虽然函数[sd]rand48
在stdlib.h
中有原型,但它们位于#ifdef
内,至少在我的系统中:
#if defined __USE_SVID || defined __USE_XOPEN
因此您可能必须明确设置其中一个宏。
但是,在尝试之前,请注意它不起作用。这是因为所有这些东西都由gcc
的{{3}}控制。
有一组非常复杂的规则用于在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标题给你。
strings.h
(注意复数名称, not string.h
)和unistd.h
都不是ISO C的一部分。
答案 1 :(得分:6)
看起来您使用的功能不是ISO C99,所以当您提出要求时 严格的C99合规性,它们将不可见。
此处的信息:https://bugzilla.redhat.com/show_bug.cgi?id=130815
标志-D_POSIX_C_SOURCE=200809L
应该有用。
另请参阅此问题:Why can't gcc find the random() interface when -std=c99 is set?
答案 2 :(得分:3)
你得到的错误让它听起来像你正在使用的函数没有被声明。你确定要为它们包含正确的标题吗?
此外,使用-std=c99
可能会禁用某些不属于标准的扩展程序。您提到的所有功能都不是C标准的一部分。如果您找不到单独的标题,可以尝试-std=gnu99
。
答案 3 :(得分:2)
-std=c99
导致标题省略任何可能与C99保留命名空间之外的名称使用冲突的内容,包括所有标准POSIX函数。请求标头的可移植方式为您提供POSIX接口,即将_POSIX_C_SOURCE
定义为与所需POSIX版本对应的值。对于最新的POSIX(2008),这意味着:
#define _POSIX_C_SOURCE 200809L
或在命令行上:
-D_POSIX_C_SOURCE=200809L
编辑:您想要的功能似乎不在POSIX基础中,而是在XSI选项中,因此您应该将_XOPEN_SOURCE
定义为适当的值(700
是得到他们的最新消息。这也可以从命令行或源文件中完成(但是如果来自源文件,则必须在之前包括任何系统头文件。
答案 4 :(得分:1)
C99中不再允许隐式声明(假定未声明的函数返回int)。
那就是说,gcc不会中止编译。
尝试将strings.h
包含在bzero
中,另请参阅paxdiablo的回答。
答案 5 :(得分:1)
您要求符合标准,而C99未将srand48()
定义为<stdlib.h>
提供的功能。
对于GNU C库,您可以在/usr/include/features.h
之前#define
之前#include
定义评论中列出的一个或多个选项来请求其他功能,或-D
标记为gcc
。
对于srand48()
(以及drand48()
),您可能希望源文件中包含-D_XOPEN_SOURCE=500
或-D_SVID_SOURCE
(或#define _XOPEN_SOURCE 500
等。)
bzero()
和close()
如果-std=c99
有#include
个<strings.h>
和<unistd.h>
的文档标题文件,即使{{1}}也应该有效分别