次の「C」コードを検討してください。
#include<stdio.h>
main()
{
printf("func:%d",Func_i());
}
Func_i()
{
int i=3;
return i;
}
Func_i()
はソースコードの最後に定義され、で使用する前に宣言は提供されませんmain()
。コンパイラがFunc_i()
入っmain()
てきたまさにその時に、それは出てきてmain()
見つけ出しFunc_i()
ます。コンパイラは、どういうわけかによって返された値を見つけ、Func_i()
それをに渡しprintf()
ます。また、コンパイラはの戻り値の型を見つけることができないことも知っていますFunc_i()
。それは、デフォルトでは、(guesses?)の戻り値の型を取りFunc_i()
ますint
。つまり、コードにfloat Func_i()
エラーがあった場合、コンパイラは次のエラーを出しFunc_i()
ます。
上記の議論から、次のことがわかります。
コンパイラは、によって返された値を見つけることができます
Func_i()
。- コンパイラが
Func_i()
出てmain()
きてソースコードを検索することによって返された値を見つけることができる場合、明示的に言及されているFunc_i()のタイプを見つけることができないのはなぜですか。
- コンパイラが
コンパイラ
Func_i()
は、それがfloat型であることを認識している必要があります。そのため、競合する型のエラーが発生します。
- コンパイラがそれ
Func_i
がfloat型であることを知っている場合、なぜFunc_i()
int型であると仮定して、競合する型のエラーを与えるのですか?強制的にFunc_i()
float型にしないでください。
変数宣言にも同じ疑問があります。次の「C」コードを検討してください。
#include<stdio.h>
main()
{
/* [extern int Data_i;]--omitted the declaration */
printf("func:%d and Var:%d",Func_i(),Data_i);
}
Func_i()
{
int i=3;
return i;
}
int Data_i=4;
コンパイラーはエラーを示します:'Data_i' undeclared(この関数で最初に使用)。
- コンパイラがを見ると
Func_i()
、Func_()によって返された値を見つけるためにソースコードに行きます。コンパイラが変数Data_iに対して同じことをできないのはなぜですか?
編集:
コンパイラ、アセンブラ、プロセッサなどの内部動作の詳細はわかりません。私の質問の基本的な考え方は、使用後にソースコード内の関数の戻り値を伝える(書き込む)とその関数の「C」言語により、コンピューターはエラーなしでその値を見つけることができます。さて、なぜコンピューターは同様にタイプを見つけることができません。Func_i()の戻り値が見つかったため、Data_iのタイプが見つからないのはなぜですか。extern data-type identifier;
ステートメントを使用しても、その識別子(関数/変数)によって返される値を伝えていません。コンピューターがその値を見つけることができるなら、なぜタイプを見つけることができないのでしょうか。なぜ前方宣言が必要なのですか?
ありがとうございました。
Func_i
無効の暗黙的な宣言をしました。未定義の変数を暗黙的に宣言する規則はなかったため、2番目のフラグメントは常に不正な形式でした。(はい、コンパイラは最初のサンプルを受け入れます。それは、C89 / C90の下で、もしも有効であったためです。)