どのような場合にcassertを含める必要がありますか?
4 に答える
つまり、使用しないでください。使用して<assert.h>
ください。
C++11 では、"c...." ヘッダーがグローバル名前空間を汚染しないという正式な保証がすべて削除されました。
これは決して実際の保証ではなく、現在では正式な保証でさえありません。
したがって、C++11 では、"c...." ヘッダー バリアントを使用する利点は考えられなくなりましたが、あるコンパイラとそのコンパイラのバージョンで適切に機能するコードが、たとえば、名前の衝突やグローバル名前空間での異なるオーバーロード選択が原因で、別のコンパイラまたはバージョンでのコンパイルに失敗します。
SO、cassert
C++03 ではかなり無意味でしたが (名前空間にマクロを配置することはできません)、C++11 では (一般的なスキームの特殊なケースであっても) 完全に無意味です。
補遺、2013 年 12 月 22 日:
標準では、各 C++ C ヘッダーの <Xh> ヘッダーを <cX> ヘッダーの観点から定義しています。これは、対応する C ライブラリ ヘッダーの観点から定義されています。
C++11 §D.5/2 :
「それぞれが形式の名前を持つすべての C ヘッダーは、対応するcname
name.h
ヘッダーによって標準ライブラリの名前空間に配置された各名前がグローバル名前空間スコープ内に配置されているかのように動作します。」
C++11 §D.5/3 (非規範的な例):
「ヘッダー
<cstdlib>
は、名前空間内でその宣言と定義を確実に提供しますstd
。また、グローバル名前空間内でこれらの名前を提供する場合もあります。ヘッダー<stdlib.h>
は、C 標準と同様に、グローバル名前空間内で同じ宣言と定義を確実に提供します。また、名前空間内でこれらの名前を提供する場合もありますstd
。」
スタック オーバーフロー ユーザーCRのコメントにより、MinGW g++ 4.7.2 などの g++ の一部のバージョンはヘッダーに関して非常に非標準であり、C++ 標準が必要とするオーバーロードなどがないことに気付きました。<X.h>
sin
swprintf
MinGW g++ 4.7.2 にも などの機能が完全に欠けていること、および純粋な C++ ライブラリに C++11 がないなどの欠点があることは既に知っていましたstd::to_string
。ただし、C 関数のオーバーロードがないという情報は、私にとって初めてでした。
実際には、g++ でオーバーロードが不足していることは、
g++ の問題を無視する、または
欠落している g++ オーバーロードの使用を避ける (
例: のみを使用するdouble sin( double )
、またはstd
名前空間のオーバーロードを使用します ( g++ での存在を保証する
ために含める必要があります)。<cmath>
g++std
名前空間のオーバーロードを非修飾で使用するための実用的な方法の 1 つは、このコンパイラのヘッダー ラッパーを定義することです。私はそのアプローチを使用して、g ++の欠点に対処しました。printf
家族に。David Wheeler がかつて言ったように、「コンピューター サイエンスのすべての問題は、別のレベルの間接化によって解決できる」…
次に、g++ の欠落しているオーバーロードを使用する標準コードも g++ でコンパイルされるように調整できます。これにより、一定量のコードでコンパイラが標準に合わせて調整されます。
他のヘッダー ファイルと同様#include <cassert>
に、そのヘッダー ファイルで宣言されているもの ( assert()
.
簡単にアクセスできるリファレンスを見る
#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";
}