問題タブ [static-assert]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
11 に答える
20067 参照

c - C でビルド時に式をアサートする方法

ハードウェア レジスタを設定するためにあちこちで「マジック ナンバー」を使用している古いコードを整理しています。これらの数値の代わりに定数を使用して、コードをより表現力豊かなものにしたいと考えています (実際、それらは名前にマップされます)。 /レジスタを文書化するために使用される値)。

ただし、変更の量が多くなると、マジック ナンバーが壊れてしまうのではないかと心配しています。簡単な例を次に示します (レジスタ セットはより複雑です)。

代わりに:

我々は持っています:

私が探しているのは、次のビルド時バージョンです。

アップデート

@クリスチャン、迅速な対応に感謝します。これはドライバー/カーネルコードであるため、C /非ブースト環境の回答にも興味があります。

0 投票する
4 に答える
598 参照

c++ - 募集: 問題をキャッチするための C++ テンプレートのアイデアですが、コンパイル時ですか?

次のような構造体の const 配列があります。

static const SettingsSuT _table[] = {{5,1}、{1,2}、{1,1}など};

構造は次のとおりです。

  • size_bytes:
  • アイテム数:
  • その他の「メタデータ」メンバー

したがって、「合計サイズ」は、1 つの要素の size_bytes*num_items です。この情報はすべて const 配列にあり、コンパイル時に利用できます。ただし、_table の合計サイズは EEPROM 自体のサイズとは関係がないことに注意してください。_table は EEPROM をミラーリングしません。必要なレイアウト、使用法、およびその他の「メタデータ」タイプの情報のみを記述します。ただし、このメタデータを使用して、使用している EEPROM の量を判断できます。

配列は、固定/最大サイズを持つ外部 EEPROM に格納されているデータを単に記述します。機能が追加および削除されると、const 配列のエントリが変更されます。現在、データの合計サイズをランタイム チェックして、EEPROM サイズを超えないようにしています。

ただし、ビルドがすぐに停止するように、これらのランタイム チェックの多くを static_assert スタイルのテンプレート チェックに変更しています。私はテンプレートの専門家ではないので、これについていくつかの助けを借りることができます.

したがって、質問: すべての要素のサイズを合計するテンプレートを作成し (各要素の値を乗算してから、すべての結果を追加する)、 static_assert を実行し、マジック ナンバーのサイズを超えた場合にビルドを停止する方法EEPROMの。ひとつのアプローチとして典型的な再帰階乗テンプレートの例を見ていましたが、配列にアクセスできず、const値が必要です(と​​思います)。

助けてくれてどうもありがとう、

0 投票する
2 に答える
231 参照

c++ - 多くのクラスの共通プロパティを静的にアサートする方法

3つのクラスがあるとしましょう。sizeof() 各クラスがまったく同じであると予想しています-たとえば512バイトです。

BOOST_STATIC_ASSERTそのようなものすべてに適用するようなものをどのように使用できますか

  1. BOOST_STATIC_ASSERT1か所で使用するだけでよい(DRY 原則)
  2. 実行時ではなくコンパイル時に一度評価される

注: 必要な C++ 手法を使用できます (より多くのクラスを作成する、継承を使用するなど)。

私の素朴な解決策を以下に示します。

0 投票する
8 に答える
22442 参照

c++ - GCC にはコンパイル時のアサートが組み込まれていますか?

既存のコンパイル時アサートの実装は、負の配列インデックスに基づいており、GCC での診断出力が不十分です。C++0x のstatic_assert機能は非常に優れており、提供される診断出力ははるかに優れています。GCC が既にいくつかの C++0x 機能を実装していることは知っています。static_assertそれらの中にあるかどうか、そしてそれがどのGCCバージョン以降であるかを知っている人はいますか?

0 投票する
8 に答える
74124 参照

c++ - static_assert は何をしますか? また、何に使用しますか?

static_assert(...)('C++11') が手の問題をエレガントに解決する例を教えてください。

私はランタイムに精通していassert(...)ます。static_assert(...)通常よりも優先するのはいつassert(...)ですか?

また、 にboostというものがありますがBOOST_STATIC_ASSERT、 と同じstatic_assert(...)ですか?

0 投票する
6 に答える
5999 参照

c - Cコンパイル時-定数配列を使用したアサーション

コンパイル時に初期化される非常に大きな定数配列があります。

配列が正しく初期化されていることを確認したいのですが、次のようになります。

私の問題は、コンパイル時にこれを確認したいということです。このスレッドのCでのコンパイル時のアサートについて読みました:Cコンパイラがアサートします。ただし、そこで提供されるソリューションは、コンパイルエラーのサイズとして負の値を使用して配列を定義することを提案しています。

と使用:

定数配列の値を確認する必要があり、Cでは定数配列の値を使用して配列を初期化できないため、提供されたソリューションは機能しません。

それを回避する方法はありますか?他のコンパイル時のアサート?

0 投票する
6 に答える
9506 参照

c++ - ブーストなしのBOOST_STATIC_ASSERT

私が働いている会社ではブーストが禁止されているので、その機能を純粋なC++で実装する必要があります。私はブーストソースを調べましたが、少なくとも私にとっては、それらは複雑すぎて理解できないようです。C ++ 0x標準で呼ばれるものがあることは知っていstatic_assert()ますが、C++0xの機能は使用したくありません。

0 投票する
6 に答える
5412 参照

c++ - const変数の静的アサート?

静的アサートは、コンパイル時に物事をチェックするのに非常に便利です。単純な静的アサート イディオムは次のようになります。

これは次のようなものに適しています

と:

しかし、使用#defineは定数を定義する「C++」の方法ではありません。C++ では、匿名の名前空間を使用する必要があります。

あるいは:

これに関する問題は、 をconst int使用することができずSTATIC_ASSERT()、ばかげた実行時チェックに頼らなければならないことです。

現在の C++ でこれを適切に解決する方法はありますか?
C++0xにはこれを行うための機能があると読んだと思います...


編集

よし、これで

正常にコンパイルされます
が、これは:

ではない。
(Visual Studio 2008 の場合)

どうして?

0 投票する
3 に答える
4020 参照

c++ - メッセージでstatic_assertをブーストしますか?

1.43 ブーストでは、BOOST_STATIC_ASSERT はブール値のみを許可しているようですが、コンパイル エラーでもメッセージを表示できる代替手段はありますか?

0 投票する
13 に答える
96832 参照

c - Cでの静的アサート

GCCに特に重点を置いて、C(C ++ではなく)でコンパイル時の静的アサーションを実現するための最良の方法は何ですか?