[解決済み] static_assertは何をするものですか、そしてあなたは何に使いますか?
質問
例として
static_assert(...)
('C++11') が手元の問題をエレガントに解決するような例を教えてください。
私はランタイムに精通している
assert(...)
. どのような場合に
static_assert(...)
よりも、通常の
assert(...)
?
また
boost
というものがあり
BOOST_STATIC_ASSERT
と同じなのでしょうか?
static_assert(...)
?
どのように解決するのですか?
Static assertは、コンパイル時にアサーションを行うために使用されます。静的アサーションが失敗した場合、プログラムは単にコンパイルされません。これは様々な場面で役に立ちます。例えば、ある機能を実装する際に
unsigned int
オブジェクトが正確に 32 ビットであることに決定的に依存するコードによって、 ある機能を実装する場合などです。次のようにスタティックアサートを記述することができます。
static_assert(sizeof(unsigned int) * CHAR_BIT == 32);
をコードに追加してください。別のプラットフォームで、異なるサイズの
unsigned int
の型が異なる場合、コンパイルは失敗します。そのため、開発者はコードの問題のある部分に注意を払い、再実装または再調査するように助言されます。
別の例として、ある積分値を
void *
として関数に渡したい場合 (ハックですが、時には便利です)、積分値がポインタに収まるかどうかを確認したい場合があります。
int i;
static_assert(sizeof(void *) >= sizeof i);
foo((void *) i);
をアセットしたいかもしれません。
char
タイプは署名されています。
static_assert(CHAR_MIN < 0);
あるいは、負の値との積分ではゼロになる。
static_assert(-5 / 2 == -2);
といった具合に。
多くの場合、静的アサーションの代わりに実行時アサーションを使用することができますが、実行時アサーションは実行時にしか動作せず、アサーションに制御が移るときだけ動作します。このため、失敗した実行時アサーションは、長期間にわたって検出されずに眠っている可能性があります。
もちろん、静的アサーションの式は、コンパイル時の定数でなければなりません。実行時の値にはできません。実行時の値については、通常の
assert
.
関連
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] Pythonの "assert "はどのように使うのですか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む