たとえば、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でのみ動作する必要があります。
zlibのプリプロセッサシンボル(変更されそうもない)を単にチェックすることはできず、 'HAVE_ZLIB == 1 'なら'#error'を発行できますが、このシンボルは定義されていませんか? – sbi
@sbi:それは 'HAVE_ZLIB'の不正使用を検出しますが、これはOPが望むものではありません:zlibが存在しない場合、クラスを完全に削除するのではなく、クラスを保持しますが、それを使用する。 –
@ルクトゥーラン:ああ、私は間違っているはずです。ごめんなさい。 – sbi