C の最も厄介な解析
C では、コード スニペットの解析方法により、予期しない動作が発生する可能性があります。悪名高い例の 1 つは、「最も厄介な解析」として知られています。
関数宣言の謎
次のコードを考えてみましょう:
widget w(gadget(), doodad());
一見すると、ウィジェット型の w という名前の変数を宣言しているように見えます。ただし、このコードは実際には、2 つの引数を取る w という名前の関数を定義しています。
引数の減衰とポインター キャスト
関数宣言では、配列型の引数はポインターに減衰します。最初の要素に追加され、関数型の引数が関数ポインターに分解されます。したがって、w の同等の宣言は次のようになります。
widget w(gadget(*)(), doodad(*)());
これは、関数 w が最初の引数として、引数をとらずガジェットを返す関数へのポインターを取ることを意味します。また、2 番目の引数、つまり引数をとらずに doodad を返す関数へのポインタも受け取ります。関数自体はウィジェットを返します。
追加の複雑さ
「最も厄介な解析」は、次のような場合にはさらに複雑になります:
widget w(gadget(x));
x がすでに変数である場合、これを関数宣言としてどのように解釈できますか?その答えは、 C では変数を宣言するときに追加の括弧を使用できるという事実にあります。したがって、ガジェット x;およびガジェット (x);どちらも x という名前の同じ変数を宣言します。したがって、上記のコードは、x という名前のガジェット型の最初の引数を受け取り、ウィジェットを返す関数の宣言です。
以上がC の「最も厄介な解析」とは何ですか?また、それがどのように関数宣言を誤解させるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。