防止“警告:函数的隐式声明”setlinebuf'...“
Clang/LLVM和GCC都显示此警告。我知道必须包含标题才能使用许多功能,但stdio.h
包含在文件的顶部。我使用了来自同一标题的其他功能(例如,setbuf()
),并且这些功能正常工作。如预期的那样,删除标头会导致这些其他功能出现错误和警告。防止“警告:函数的隐式声明”setlinebuf'...“
我用clang -MD -MF
显示包含的头文件和检查/usr/include/stdio.h
,其中包含setlinebuf()
的原型。我在网上找到了一个参考unix.h
,但这似乎并不存在于我的系统中。
我使用的是Lubuntu 16.10 x86_64,Clang 3.8.1。
View source:包括第1行,上线路32
功能使用包含此包括stdio.h
之前:
#define _BSD_SOURCE
setlinebuf()
不是标准C函数,因此它可以不包括默认在stdio.h
。
但请注意,_BSD_SOURCE
已被弃用,因为glibc 2.20已被_DEFAULT_SOURCE
取代。
'_DEFAULT_SOURCE' did the把戏,谢谢你。这样做有什么缺点吗?标准C可以达到同样的效果吗?编辑:“setlinebuf()函数完全等价于调用:'setvbuf(stream,NULL,_IOLBF,0);'” – Blieque
'setlinebuf()'不在C标准库中。因此,它需要这个额外的宏来公开这个接口。但是你不必使用它。 手册页甚至建议使用'setvbuf()':'setvbuf(stream,buf,buf?_IOFBF:_IONBF,BUFSIZ);',它是C标准库的一部分,并且不会 需要任何额外的宏。 'setlinebuf()'在可用的时候更加方便(我在AIX时代已经使用过)。但是,如果你正在写严格标准的投诉 或担心可移植性,那么你可以很容易地避免它。 –
您需要为该函数使用适当的功能测试宏。请参阅'man setlinebuf' – BadZen
... [是](http://man7.org/linux/man-pages/man3/setlinebuf.3.html)在任何include之前添加'#define _BSD_SOURCE',以告诉库头文件你想要的BSD功能(其中'setlinebuf()'是一个)。 –
建议阅读'setlinebuf()'的手册页,其中包含以下语句:'glibc的功能测试宏要求(参见feature_test_macros(7)): setbuffer(),setlinebuf():_BSD_SOURCE' – user3629249