为什么设置-std=c99时gcc找不到random()接口?
题
我愿意 "#include <stdlib.h>"
在源的顶部。
编译示例:
/usr/bin/colorgcc -std=c99 -fgnu89-inline -g -Wall -I/usr/include -I./ -I../ -I../../ -I../../../ -I../../../../ -O3 -o f8 f8.c
In file included from f8.c:7:
ctype-cmp.c: In function ‘randomized’:
ctype-cmp.c:48: warning: implicit declaration of function ‘random’
ctype-cmp.c: In function ‘main’:
ctype-cmp.c:153: warning: implicit declaration of function ‘srandom’
ais@xcalibur:t$
当我关闭-std=c99时,找不到函数isfinite()。因此,出于这个原因和其他原因,我确实想使用 -std=c99 。我缺少什么技巧吗?
解决方案
man srandom
说,功能是C99的不的一部分,但POSIX的一部分。
启动_BSD_SOURCE
或_XOPEN_SOURCE >= 500
或任何其它合适的功能测试宏声明了srandom /随机函数(见man feature_test_macros
和man srandom
)。
这人有很好的机会,但你需要通过阅读上面的手册页找出被定义/不隐式定义,从而太宏。
/usr/bin/colorgcc -std=c99 -D_XOPEN_SOURCE=600 -fgnu89-inline -g -Wall
-I/usr/include -I./ -I../ -I../../ -I../../../ -I../../../../ -O3 -o f8 f8.c
其他提示
是的,你缺少一个技巧:您可以使用 -std=gnu99
代替 -std=c99
.
-std=c99
#define
s __STRICT_ANSI__
, , 哪个 /usr/include/features.h
解释为“默认情况下不启用 C 标准之外的任何内容”(没有它,您至少会得到两者 _SVID_SOURCE
和 _BSD_SOURCE
). -std=gnu99
, 另一方面,表示“C99 加 GNU 扩展”(gcc 默认值当前为 -std=gnu89
, ,其 C89 等效项,这就是为什么您需要指定某些内容才能获得新的 C99 功能)。
作为替代方案,您可以启用功能测试宏(如 @litb 的答案中所述)。看着 /usr/include/stdlib.h
在我的系统中,它期望其中之一 __USE_SVID
, __USE_XOPEN_EXTENDED
, , 或者 __USE_BSD
. /usr/include/features.h
告诉我可以启用这些功能的功能测试宏是:
_SVID_SOURCE
(启用__USE_SVID
)_BSD_SOURCE
(启用__USE_BSD
)_XOPEN_SOURCE
其值至少为500
(启用__USE_XOPEN_EXTENDED
)_XOPEN_SOURCE_EXTENDED
(还可以使__USE_XOPEN_EXTENDED
)_GNU_SOURCE
(启用一切,包括上面的四个功能测试宏)
对于您不太担心与未来标准中的新函数发生潜在名称冲突的新程序,请同时使用 -std=gnu99
和 -D_GNU_SOURCE
是个好主意。它允许您使用所有新的标准功能和 GNU 扩展,并结合某种后备(例如, autoconf
-风格的功能测试)提供了最大的灵活性。
参考:
我的Ubuntu 9.10下创建使用代码块GCC随机数(与编译器选项:-std=gnu99 -D_GNU_SOURCE
)所以这个工作对我来说:
这是我的代码我曾与播放:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
enum computer {keyboard, CPU, screen, printer};
int main(void)
{
enum computer comp;
time_t casovac;
comp = CPU;
srand(&casovac);
printf("%d", rand());
return 0;
}
这是唯一的想法,当然也可以通过其他方法完成它;-) [要安装的码块使用:sudo apt-get install build-essential
然后sudo apt-get install codeblocks
]
我使用兰特()和srand()函数。 BTW:你忘了一个或两个头?至少第二警告告诉我。
尝试包括math.h中(只记得我们一直与数学库的问题,与实际强制与-lm链接它)。