为什么在设置-std = c99时gcc不能找到random()接口?

Set*_*jmp 18 c random gcc c99 c89

我做"#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$ 
Run Code Online (Sandbox Code Playgroud)

当我关闭-std = c99时,无法找到函数isfinite().所以我确实想要使用-std = c99这个和其他原因.有什么技巧我不见了?

Joh*_*itb 15

man srandom说该功能不是 C99的一部分,而是POSIX的一部分.

激活_BSD_SOURCE或者_XOPEN_SOURCE >= 500声明srandom/random函数的任何其他合适的功能测试宏(请参阅man feature_test_macrosman 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
Run Code Online (Sandbox Code Playgroud)


Ces*_*arB 12

是的,有一个你缺少的技巧:你可以用-std=gnu99而不是-std=c99.

-std=c99 #defines __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样式功能测试)提供最大的灵活性.

参考文献: