• 締切済み

コンパイル時の静的チェックについて

次のような配列があります。 static const int ary[]={1,2,3,4,5}; この配列の要素数が5であることは、次の方法でコンパイル時にチェック出来ます。 #define ARRAYSIZE(a) (sizeof(a) / sizeof(*(a))) static_assert(ARRAYSIZE(ary) == 5); では、この配列で4以上の要素数が2であることをコンパイル時にチェックするにはどうしますか? 実行時であれば次のように出来ます。 assert(count_if(ary, ary+sizeof(ary), [](int i)->bool {return (i >= 4); }) == 2); 結果はコンパイル時に確定しているはずなのですが、この方法だとライブラリ関数を使用するので実行時にしかチェック出来ません。 「テスト用プロジェクトを作って...」というのも「コンパイル時に確認」ではないので無しとします。

みんなの回答

回答No.5

配列内に、「4以上」が何個あるか?って意味か。。 それだと、確かにプリプロセッサは使えないですね。 #ifでは、判定無理でした。 すいません。意味を間違えてました。

回答No.4

https://docs.microsoft.com/ja-jp/cpp/preprocessor/hash-if-hash-elif-hash-else-and-hash-endif-directives-c-cpp?view=vs-2019 んま、2にこだわる理由がよくわかりませんが、 プリプロセッサ #if ~ #else ~ #endif は、条件判断もできるので、 そこで適切な処理をすればいいかと。。 逆にこれでだめなら、答えがないような気がしなくもないですが。

katorea21
質問者

お礼

ここに挙げた例は説明用に単純化しています。実際は構造体型の配列で、その中のメンバがある値に等しい要素の数をチェックしたいのです。 #if ~ #else ~ #endifで具体的にどのように書けば出来ますか?

  • maiko04
  • ベストアンサー率17% (345/1956)
回答No.3

2==2の評価にどれほどの価値があるのでしょうか? 全く無意味ですよね。 そういうのはエラーで全て排除されます。 まぁ、最終的にはOSとかコンパイラーの性能なんですけどね。 Cの文法でエラーにしなければならないとはうたっていないと思いますので 通過する可能性はあります。

  • maiko04
  • ベストアンサー率17% (345/1956)
回答No.2

ついでに言いますと sizeof(a) == 2 というコーディングをすると 「置き換え」ですので 2==2 という文をコンパイルされてコンパイルエラーになります。 そういう意味で「置き換え」なのです。

katorea21
質問者

お礼

2==2 という文をコンパイルされるとなぜコンパイルエラーになるのでしょう? trueと評価されるだけだと思いますが。

  • maiko04
  • ベストアンサー率17% (345/1956)
回答No.1

回答ではないのですが、sizeofはコンパイル時に「確定」ではなくて 2とか5とかの数字に「置き換え」られますので実行時に変更はありえません。

katorea21
質問者

お礼

sizeofは機械語に翻訳された時点で数値に置き換えられるのは理解しています。最近まで実行時に計算されると勘違いしてましたが。

関連するQ&A

専門家に質問してみよう