2017-12-04 1 views
3

I came across次のコード行は、わかりません。Cの 'switch 0'ステートメントの目的は何ですか?

#define static_assert(a, b) do { switch (0) case 0: case (a): ; } while (0) 

switch (0)の一部は何ですか? 0falseに相当すると仮定すると、switch文を入力しないという意味ですか?

case (a)の行についても、未知数aをケースとしてどのように指定できますか?

+3

これはすべて、「a」がコンパイル時定数であることを確認することです。 'b'は使用されていません。それが展開するコードは、実際に何もせずに落ちるだけです。 'switch(0)'は 'switch(100)'や他の値と変わらない。それは 'case 0'に分岐し、そこから実行が続きます。 'a'は変数ではありません。マクロに渡すものは何でも構いません。それは定数でなければなりません。変数を渡すと、コンパイル時にエラーが発生します。 –

+3

['static_assert'](https://stackoverflow.com/q/1647895/995714)は、ここでの意図と使用方法が異なりますが、その名前が良い選択ではありませんが、いくつかのヒントを与えることができます –

+3

標準の実装としての欠陥'static_assert'は関数の外では動作しないので –

答えて

5

switch(0)は、case 0:ブロックに関連付けられたコードブロックを常に実行します。それでも、実際に実行されるコードはありません。どちらのケースも空です。 - 明示的に提供される一つ、一つ、この場合には、拡張されたマクロは、2 case 0:を持っています。ここ

ポイントがアサート式(a)が確認されていない場合は、コンパイル時でコンパイラは怒っているようですアサートされた式の結果を使用します(失敗した場合は0になります)。この結果、2つの同一のcaseを持つswitchが生成されます。これは許可されず、コンパイル時にコンパイラがエラーで停止します。

また、渡された式がコンパイル時に評価されない定数(実行時にはcaseの値を持つことができないため)は、static_assertからも期待されます。

関連する問題