当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么在设置-std=c99时gcc不能找到random()接口?》经验,为你挑选了2个好方法。

我做"#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这个和其他原因.有什么技巧我不见了?



1> Johannes Sch..:

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



2> CesarB..:

是的,有一个你缺少的技巧:你可以用-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样式功能测试)提供最大的灵活性.

参考文献:

控制C语言的选项

功能测试宏

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有