web-dev-qa-db-ja.com

どのような場合に<cassert>を含める必要がありますか?

どのような場合にcassertを含める必要がありますか?

49
Jane

つまり、使用しないでください。 _<assert.h>_を使用します。

C++ 11は、「c ....」ヘッダーがグローバル名前空間を汚染しないという正式な保証を削除しました。

これは実際の保証ではありませんでしたが、現在では正式な保証でさえありません。

したがって、C++ 11では、「c ....」ヘッダーバリアントを使用することで考えられる利点はなくなりましたが、1つのコンパイラとそのコンパイラのバージョンでうまく機能するコードには、たとえば、別のコンパイラまたはバージョンでコンパイルできない名前の衝突、またはグローバル名前空間での異なるオーバーロードの選択。

SO、cassertはC++ 03ではかなり意味がありませんでしたが(名前空間にマクロを置くことはできません)、C +では完全に意味がありません-一般的なスキームの特殊なケースとしても- +11。


補遺、2013年12月22日:

標準は、各C++Cヘッダー<X.h>ヘッダーを<cX>ヘッダーの観点から定義します。これは、対応するCライブラリヘッダーの観点から定義されます。

C++ 11§D.5/ 2

「それぞれが_name.h_という形式の名前を持つすべてのCヘッダーは、対応するcnameヘッダーによって標準ライブラリの名前空間に配置された各名前が配置されているかのように動作します。グローバル名前空間スコープ内。」

C++ 11§D.5/ 3(非規範的な例):

「ヘッダー_<cstdlib>_は、名前空間std内の宣言と定義を確実に提供します。また、グローバルネームスペース内でこれらの名前を提供することもあります。ヘッダー_<stdlib.h>_は、C標準と同様に、グローバル名前空間内で同じ宣言と定義を確実に提供します。名前空間std内でこれらの名前を提供することもあります。」

スタックオーバーフローユーザー CR のコメントにより、MinGW g ++ 4.7.2などのg ++​​の一部のバージョンはかなり非標準_<X.h>_ヘッダーに関して、egのオーバーロードがないsin C++標準で必要なもの:

MinGW g ++ 4.7.2にもswprintfなどの関数がまったくないこと、およびC++ 11 _std::to_string_がないなどの純粋なC++ライブラリの短所があることはすでに知っていました。ただし、C関数のオーバーロードがないことに関する情報は、私にとっては初めてでした。

実際には、g ++でのオーバーロードの欠如は、

  • g ++の問題を無視する、または

  • 不足しているg ++オーバーロードの使用を避け、
    例えば。 double sin( double )のみを使用する、または

  • std名前空間オーバーロードの使用
    (g ++での存在を保証するには、_<cmath>_を含める必要があります)。

非修飾のg ++​​ std名前空間オーバーロードを使用するための1つの実用的なアプローチは、このコンパイラーにheaders wrappersを定義することです。私はその方法を使用して、g ++の欠点のwrtに対処しました。 printfファミリーへ。 David Wheelerがかつて述べたように、「コンピューターサイエンスのすべての問題は、別のレベルの間接参照で解決できる」…

次に、g ++の欠落したオーバーロードを使用する標準コードがg ++でもコンパイルされるように、物事を調整できます。これにより、一定量のコードでコンパイラーを標準に調整します。

41

他のヘッダーファイルと同様に、assert()など、そのヘッダーファイルで宣言されているものを使用すると、#include <cassert>になります。

8
Greg Hewgill

簡単にアクセスできる 参照 を参照してください

#include <iostream>
// uncomment to disable assert()
// #define NDEBUG
#include <cassert>

int main()
{
    assert(2+2==4);
    std::cout << "Execution continues past the first assert\n";
    assert(2+2==5);
    std::cout << "Execution continues past the second assert\n";
}
0
TemplateRex

assert.hは、標準のデバッグツールとして使用できる1つのマクロ関数を定義します。

0
Praveen Kishor