2012-05-08 8 views
3

たとえば、zlibに依存するいくつかの機能を持つC++テンプレートライブラリがあります。 プリプロセッサシンボルを使用して、コマンドラインで-DHAVE_ZLIB=1と設定して機能を選択的に有効または無効にします。無効なライブラリ機能がC++テンプレートライブラリで使用されている場合の警告

私たちのCMakeベースのビルドシステムは、インストールされたzlibを認識し、そのフラグをコンパイラに追加します。 もちろん、お気に入りのIDEやMakefileを使って、手動で行うこともできます。

ライブラリの1つの特性は、zlibを使用するコードがzlibを使用しないコードとインターリーブされていることです。すなわち、#include <library/header.h>を使用すると、zlibの有無にかかわらず動作するはずです。

現時点では、#ifはzlibに依存するコードです。 したがって、ユーザが例えばCompressedStreamのようなものを使用しようとすると、そのクラスは単に見つからないだけです。 これはユーザーにとって非常に不満です。 ビルドシステムは、zlibが見つからないことを警告しますが、ユーザーであるユーザーはこれを見たり、すぐに忘れたりします。 私自身もこの罠に陥ってしまった。

質問: zlibを必要とするコードを使用しようとすると、zlibが無効であることをユーザーに警告する最も良い方法は何ですか。

私が考えることができるのは、多くのコンパイラで実装されている償却マーカーメカニズムを使用することだけです。 それぞれに異なる構文が必要ですが、これはプリプロセッサマクロを使用して簡単に抽象化できます。 他に良い方法はありますか?

このソリューションは、VS> 8、GCC> 4.2およびLLVMでのみ動作する必要があります。

+0

zlibのプリプロセッサシンボル(変更されそうもない)を単にチェックすることはできず、 'HAVE_ZLIB == 1 'なら'#error'を発行できますが、このシンボルは定義されていませんか? – sbi

+0

@sbi:それは 'HAVE_ZLIB'の不正使用を検出しますが、これはOPが望むものではありません:zlibが存在しない場合、クラスを完全に削除するのではなく、クラスを保持しますが、それを使用する。 –

+0

@ルクトゥーラン:ああ、私は間違っているはずです。ごめんなさい。 – sbi

答えて

2

このようなことについてユーザーに警告する適切な場所は、(IMO)ビルドシステムです。 Ogre3D、KDEなど多くのプロジェクトを見てみましょう。ビルドの設定後、すべてのアウトラインを印刷します。この概要には、何が見つかったのか、何が見つからないのか、そしてその結果は何かに関する情報が含まれています。

これを修正するためにQtも何もしません。 STLサポートでQtを構築するオプションがあります。そうした方法でビルドされていなければ、警告も何もなく、定義されていないメソッドに関するエラーだけをコンパイルします。だから、コンパイル時にこのようなことをユーザに警告する方法はないと思います。

関連する問題