我做"#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函数的任何其他合适的功能测试宏(请参阅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
样式功能测试)提供最大的灵活性.
参考文献:
控制C语言的选项
功能测试宏