C の最も厄介な解析: 関数宣言の謎を明らかにする
ウィジェット w(); の構文を理解しながら
widget w( gadget(), doodad() ); // pitfall: not a variable declaration
この謎を解明するには、 C の減衰規則を詳しく調べることが重要です。関数宣言内では、配列型の引数は最初の要素を指すポインターに縮退しますが、関数型の引数は関数ポインターに変換されます。
この原則を適用すると、前述のコードは次のシグネチャに変換されます。
widget w( gadget(*)(), doodad(*)() );
これは、2 つの引数を受け入れる関数を示します。1 つは引数をとらず、ガジェット タイプを返す関数へのポインタ、もう 1 つは引数を 0 も取らず、doodad タイプを返す関数へのポインタです。関数自体はウィジェットを返します。
複雑さはそれだけではありません。この複雑な例を考えてみましょう:
widget w(gadget(x));
x が変数である場合、これはどのようにして関数宣言になるのでしょうか?
C では、変数を宣言するときに追加の括弧を含めることができます。ガジェットx;およびガジェット (x);。これは関数の引数にも適用され、上記のコードは、ガジェット型の x という名前の引数を 1 つ取り、ウィジェットを返す関数宣言として解釈できます。
以上が`widget w(gadget(), doodad());` は C の変数宣言ですか、それとも関数宣言ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。