- 締切済み
コンパイル時の静的チェックについて
次のような配列があります。 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); 結果はコンパイル時に確定しているはずなのですが、この方法だとライブラリ関数を使用するので実行時にしかチェック出来ません。 「テスト用プロジェクトを作って...」というのも「コンパイル時に確認」ではないので無しとします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- AsarKingChang
- ベストアンサー率46% (3467/7474)
配列内に、「4以上」が何個あるか?って意味か。。 それだと、確かにプリプロセッサは使えないですね。 #ifでは、判定無理でした。 すいません。意味を間違えてました。
- AsarKingChang
- ベストアンサー率46% (3467/7474)
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 は、条件判断もできるので、 そこで適切な処理をすればいいかと。。 逆にこれでだめなら、答えがないような気がしなくもないですが。
- maiko04
- ベストアンサー率17% (345/1956)
2==2の評価にどれほどの価値があるのでしょうか? 全く無意味ですよね。 そういうのはエラーで全て排除されます。 まぁ、最終的にはOSとかコンパイラーの性能なんですけどね。 Cの文法でエラーにしなければならないとはうたっていないと思いますので 通過する可能性はあります。
- maiko04
- ベストアンサー率17% (345/1956)
ついでに言いますと sizeof(a) == 2 というコーディングをすると 「置き換え」ですので 2==2 という文をコンパイルされてコンパイルエラーになります。 そういう意味で「置き換え」なのです。
お礼
2==2 という文をコンパイルされるとなぜコンパイルエラーになるのでしょう? trueと評価されるだけだと思いますが。
- maiko04
- ベストアンサー率17% (345/1956)
回答ではないのですが、sizeofはコンパイル時に「確定」ではなくて 2とか5とかの数字に「置き換え」られますので実行時に変更はありえません。
お礼
sizeofは機械語に翻訳された時点で数値に置き換えられるのは理解しています。最近まで実行時に計算されると勘違いしてましたが。
お礼
ここに挙げた例は説明用に単純化しています。実際は構造体型の配列で、その中のメンバがある値に等しい要素の数をチェックしたいのです。 #if ~ #else ~ #endifで具体的にどのように書けば出来ますか?