3

私は多くのアサーションを持つライブラリを書いています。アサートがオンになっているとライブラリは非常に遅くなり、ライブラリの要点は高速であるため、バグをテストまたは診断する場合にのみアサートが意味をなします。私はautoconfを使用していますが、ユーザーにこの問題について知ってもらい、アサートを無効にするように構成するフラグを渡すように要求するのが標準的な方法のようです。その場合、適切なバージョンのライブラリをインストールするのに十分な知識があるのは、エキスパートユーザーだけです。それは本当に私がすべきことであり、もしそうなら、それは単に「エキスパートユーザーや他のプログラマーが期待すること」を超えた正当な理由がありますか?

編集: これは、リリースモードでデフォルトでNDEBUGを定義するべきではないという議論の例ですが、それを行うのは驚くべきことであるため、他の理由はありません

4

2 に答える 2

1

私は今これを理解したと思います。NDEBUGを定義する際の問題は、未定義の動作につながる可能性があることです。私のコードはテンプレート以外の部分を含むテンプレートライブラリであるため、私のコードは他の人のバイナリにインライン化されます。非インラインコードをコンパイルするときにNDEBUGを定義し、クライアントコードがNDEBUGなしでコンパイルされると、ヘッダーからのコードの互換性のないバージョンが2つあります。1つはassertあり、もう1つはなしです。これは未定義の動作につながり、私は自分の前に一度不思議なクラッシュとしてこの問題に遭遇しました。したがって、ライブラリでNDEBUGを定義する必要はないと思います。特定のコンピュータですべてをコンパイルする担当者またはビルドシステムが、NDEBUGについて決定する必要があります。

ただし、デフォルトでアサートなしでライブラリを実行するためだけにNDEBUGを定義する必要はありません。これで、マクロMYLIB_DEBUGとMYLIB_ASSERTができました。MYLIB_DEBUGが定義されていない場合、MYLIB_ASSERT(X)は何もしません。MYLIB_DEBUGが定義されている場合、MYLIB_ASSERT(X)はassert(X)として定義されます。これにより、NDEBUGをいじることなく、assertsがオプトインになります。

したがって、私の質問に対する私の現在の答えは、ライブラリがデフォルトでアサートをオフにするのは問題ないということです。インターフェイスにアサートを含むインライン関数がある場合は、NDEBUGを定義してオフにしないでください。

于 2012-10-15T18:50:07.923 に答える
-1

assertを使用するとライブラリが遅くなる場合は、必要に応じて実行し、オフにします。それが明確に文書化されていることを確認してください...そして心配するのをやめてください。

于 2012-07-29T00:31:57.370 に答える