1

私は初心者なので、ルールを超えてしまったらお詫びします。これが私の質問です。

コードブロックでGCCコンパイラを使用していますが、特定のコードスニペットで気付いた独特のことがあります。誰かがこれに光を当てることができることを願っています。

int main()
{
Tree *t;
//some operations on the tree
traverse();// No parameter is passed here.
...
}

void traverse(Tree *t)
{
..
}

次のコードでは、関数traverse()が正しく実行されます。私の質問はなぜですか?これについてはよくわかりませんが、関数が宣言されていない場合、デフォルトの型はintになります。これで、コンパイラはコンパイル時のエラーを抑制しただけでなく、パラメータ't'を関数traverse()に正しく提供しました。

これはインテリジェントなコンパイラ設計によるものですか?

したがって、一般的に、私が持っている質問は、コンパイラがまだ宣言されていないメソッドに遭遇した場合、コンパイラはデフォルトでどのような動作をするのかということです。さらに重要なのは、どのパラメーターを渡したいかをどのように「知る」のでしょうか。

ご存知のとおり、「Tree *」のインスタンスは、t1、t2、t3の3つでした。その場合、コンパイラはどちらを渡しますか?

私はグーグルで周りを見回してみましたが、決定的な情報源をまだ見つけていません。

お時間をいただきありがとうございます。:)

4

1 に答える 1

3

関数はスタックで引数を探しています。関数は、期待している引数が実際に存在しないことを認識していません。

たまたま、引数を探しているスタック上のものは、関数t内のローカル変数main()です。内部にローカル変数がもっとmain()あると、そのうちの1つが関数の引数として誤って解釈され、事態がひどく悪くなります。

だから、それは純粋に偶然に働いています。

于 2012-11-20T17:36:10.990 に答える