gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:22:44 27 4
gpt4 key购买 nike

我正在尝试在 Linux 系统上编译 C 程序。我有一个 #include 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) .

最佳答案

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

不,但它们可能会显示出您对其工作方式的知识的局限性:-)


虽然函数 [sd]rand48stdlib.h 中有原型(prototype),但它们在 #ifdef 中,至少在我的系统:

#if defined __USE_SVID || defined __USE_XOPEN

因此您可能必须显式设置其中一个宏。

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

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

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

但也许更简单的方法是仅使用带有 GNU 扩展的 C99。为此,将 -std=c99 替换为 -std=gnu99

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

起初我有点困惑,为什么这些编译时使用 -std=c99,而它们与 C99 完全没有有关,但后来我意识到标志只是控制标准 C header 为您提供的内容。

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

关于-std=c99 可以阻止我的#includes 正常工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4893382/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com