为什么在设置-std = c99时gcc不能找到random()接口?
我在源代码的顶部做"#include "
。
示例编译:
/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 / random函数的任何其他合适的function测试宏(请参阅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等价,这就是为什么你需要指定一些东西来获得新的C99function)。
作为替代方案,您可以启用function测试宏(如@ litb的答案中所述)。 在我的系统中查看/usr/include/stdlib.h
,它需要__USE_SVID
, __USE_XOPEN_EXTENDED
或__USE_BSD
。 /usr/include/features.h
告诉我,启用它们的function测试宏是:
-
_SVID_SOURCE
(启用__USE_SVID
) -
_BSD_SOURCE
(启用__USE_BSD
) -
_XOPEN_SOURCE
,其值至少为500
(启用__USE_XOPEN_EXTENDED
) -
_XOPEN_SOURCE_EXTENDED
(也启用__USE_XOPEN_EXTENDED
) -
_GNU_SOURCE
(启用所有function,包括上面的四个function测试宏)
对于您不太关心未来标准中新function的潜在名称冲突的新程序,使用-std=gnu99
和-D_GNU_SOURCE
是一个好主意。 它允许您使用所有新的标准function和GNU扩展,结合某种后备(例如, autoconf
风格的function测试)提供最大的灵活性。
参考文献:
- 控制C语言的选项
- function测试宏
我在Ubuntu 9.10下的CodeBlocks中使用gcc创建了随机数(带编译器选项: -std=gnu99 -D_GNU_SOURCE
)所以这对我-std=gnu99 -D_GNU_SOURCE
:
这是我玩过的代码:
#include #include #include #include enum computer {keyboard, CPU, screen, printer}; int main(void) { enum computer comp; time_t casovac; comp = CPU; srand(&casovac); printf("%d", rand()); return 0; }
这只是一个想法,当然你可以通过其他方式完成它;-) [安装CodeBlocks使用: sudo apt-get install build-essential
然后sudo apt-get install codeblocks
]
我使用rand()和srand()。 顺便说一句:你有没有忘记一两个头? 至少第二次警告告诉我。
尝试包括math.h. (记得我们总是遇到数学库的问题,不得不用-lm强制链接它)。