【问题标题】:Preventing "warning: implicit declaration of function 'setlinebuf'..."防止“警告:函数'setlinebuf'的隐式声明......”
【发布时间】:2016-11-09 21:09:13
【问题描述】:

Clang/LLVM 和 GCC 都显示此警告。我知道必须包含标题才能使用许多功能,但 stdio.h 包含在文件顶部。我从同一个标头中使用了其他功能(例如setbuf()),这些功能都很好。正如预期的那样,删除头包含会导致为这些其他函数抛出错误和警告。

我使用clang -MD -MF 显示包含的头文件并检查了/usr/include/stdio.h,其中包含setlinebuf() 的原型。我在网上找到了一个对 unix.h 的引用,但这似乎在我的系统上不存在。

我正在使用 Lubuntu 16.10 x86_64,Clang 3.8.1。

View source: 第 1 行包含,第 32 行函数使用。

【问题讨论】:

  • 您需要为该功能使用适当的功能测试宏。见man setlinebuf
  • ...which is 在任何包含之前添加#define _BSD_SOURCE,告诉库头文件您想要BSD 功能(其中setlinebuf() 是其中之一)。
  • 建议阅读 setlinebuf() 的手册页,其中包含以下语句:Feature Test Macro Requirements for glibc (see feature_test_macros(7)): setbuffer(), setlinebuf(): _BSD_SOURCE

标签: c gcc clang


【解决方案1】:

包括此之前包括stdio.h

#define _BSD_SOURCE

setlinebuf() 不是标准 C 函数,因此默认情况下它可能不包含在 stdio.h 中。

但请注意,自 glibc 2.20 起,_BSD_SOURCE 已被弃用,并被 _DEFAULT_SOURCE 取代。

【讨论】:

  • _DEFAULT_SOURCE 成功了,谢谢。这样做有什么缺点吗?标准C不能达到同样的效果吗?编辑:“setlinebuf() 函数完全等同于调用:setvbuf(stream, NULL, _IOLBF, 0);
  • setlinebuf() 不在 C 标准的库中。因此,它需要这个额外的宏来公开这个接口。但你不必使用它。手册页甚至建议使用 setvbuf():setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ); 的替代方法,它是 C 标准库的一部分,不需要任何额外的宏。 setlinebuf() 在可用时更方便(我在 AIX 时代使用过)。但是,如果您是为严格标准的投诉而写作或担心可移植性,那么您可以轻松避免它。
猜你喜欢
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
相关资源
最近更新 更多