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

时间:2011-02-04 00:32:29

标签: c linux gcc

我正在尝试在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)

6 个答案:

答案 0 :(得分:12)

  

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

不,但他们可能会在知识中显示出工作方式的限制: - )


虽然函数[sd]rand48stdlib.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

而且,对于bzeroclose,可以分别从strings.hunistd.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}}也应该有效分别