みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

次のような配列があります。
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);

結果はコンパイル時に確定しているはずなのですが、この方法だとライブラリ関数を使用するので実行時にしかチェック出来ません。
「テスト用プロジェクトを作って...」というのも「コンパイル時に確認」ではないので無しとします。

投稿日時 - 2019-07-08 21:20:45

QNo.9633370

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

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

投稿日時 - 2019-07-09 04:46:05

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
は、条件判断もできるので、
そこで適切な処理をすればいいかと。。
逆にこれでだめなら、答えがないような気がしなくもないですが。

投稿日時 - 2019-07-08 23:35:00

お礼

ここに挙げた例は説明用に単純化しています。実際は構造体型の配列で、その中のメンバがある値に等しい要素の数をチェックしたいのです。

#if ~ #else ~ #endifで具体的にどのように書けば出来ますか?

投稿日時 - 2019-07-09 01:07:23

ANo.3

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

投稿日時 - 2019-07-08 23:02:18

ANo.2

ついでに言いますと

sizeof(a) == 2

というコーディングをすると
「置き換え」ですので

2==2

という文をコンパイルされてコンパイルエラーになります。

そういう意味で「置き換え」なのです。

投稿日時 - 2019-07-08 21:52:53

お礼

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

投稿日時 - 2019-07-08 22:43:17

ANo.1

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

投稿日時 - 2019-07-08 21:29:15

お礼

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

投稿日時 - 2019-07-08 22:41:24

あなたにオススメの質問