Linuxにはこの素晴らしい機能がありますdprintf
:
関数
dprintf()
andvdprintf()
(glibc2 ライブラリにある) はfprintf()
and とまったく同じvfprintf()
ですが、指定されたストリームではなくファイル記述子 fd に出力する点が異なります。
ただし、同じソースが指摘しているように:
これらの関数は GNU 拡張機能であり、C や POSIX のものではありません。明らかに、名前の選択は不適切でした。多くのシステム (MacOS など) には、 と呼ばれる互換性のない関数があり
dprintf()
、通常は のデバッグ バージョンでprintf()
、おそらく次のようなプロトタイプがあります。
void dprintf (int level, const char *format, ...);
ここで、最初のパラメーターはデバッグ レベルです (出力は to
stderr
です)。さらに、dprintf()
(orDPRINTF
) もデバッグ用の一般的なマクロ名ですprintf
。したがって、おそらく、移植性を意図したプログラムではこの関数を避ける方がよいでしょう。
私の質問
必要な関数が存在する場合はそれを安全に呼び出すdprintf
か、その関数が存在しない場合は合理的なエラーメッセージでコンパイルに失敗するセットアップを作成するにはどうすればよいですか? 私はこのようなことをすると思います:
#ifdef SOMETHING
#define Dprintf dprintf
#else
#error "no dprintf"
#endif
SOMETHING
しかし、どうあるべきかわかりません。Linux だけに制限することはできると思いますが、もっと緩くすることはできますか?