2016-11-09 5 views
2

Clang/LLVMとGCCの両方がこの警告を表示します。私は、多くの機能を使用するためにヘッダーを含める必要があることを認識していますが、ファイルの先頭にstdio.hが含まれています。同じヘッダーの他の機能(例:setbuf())を使用していますが、これらは正常に動作します。ヘッダーインクルードを削除すると、これらの他の関数のエラーと警告が予想どおりにスローされます。警告:暗黙的に関数 'setlinebuf' ...の宣言を防止する

添付ファイルを表示するのにclang -MD -MFを使用し、setlinebuf()のプロトタイプを含む/usr/include/stdio.hをチェックしました。 unix.hというオンラインのリファレンスが1つ見つかりましたが、これは私のシステムには存在しません。

私はLubuntu 16.10 x86_64、Clang 3.8.1を使用しています。

View sourceは:1行目にあり、ライン32

+1

この機能には、適切な機能テストマクロを使用する必要があります。 'man setlinebuf'を参照してください。 – BadZen

+1

...(http://man7.org/linux/man-pages/man3/setlinebuf.3.html)は、インクルードの前に' #define _BSD_SOURCE'を追加してライブラリに伝えますBSD機能( 'setlinebuf()'が1つ)を必要とするヘッダファイル。 –

+0

は、次の文を含む 'setlinebuf()'のマニュアルページを読むことをお勧めします: 'glibcの機能テストマクロ要件(feature_test_macros(7)参照): setbuffer()、setlinebuf():_BSD_SOURCE' – user3629249

答えて

4

上の機能利用を含めるこのstdio.hを含む前:

#define _BSD_SOURCE 

setlinebuf()は、標準C関数ではないので、それが含まれていなくてもよいですデフォルトではstdio.hです。

しかし、_BSD_SOURCEは、glibc 2.20以降廃止予定であり、_DEFAULT_SOURCEで置き換えられています。

+0

' _DEFAULT_SOURCE'はトリック、ありがとう。これには何か欠点はありますか?標準Cで同じことを達成できないのでしょうか? "setvbuf(stream、NULL、_IOLBF、0);' " – Blieque

+1

' setlinebuf() 'はCの標準ライブラリにありません。したがって、このインタフェースを公開するには、この追加のマクロが必要です。しかし、あなたはこれを使う必要はありません。 マニュアルページでは、C標準ライブラリの一部であり、追加のマクロを必要としない 'setvbuf()': 'setvbuf(stream、buf、buf?_IOFBF:_IONBF、BUFSIZ);' 'setlinebuf()'は利用可能な場合より便利です(私はAIXの時代に使用しました)。しかし、厳密に標準の苦情 を書いているか、移植性に懸念がある場合は、簡単に回避できます。 –

関連する問題