関数プロトタイプがない場合、関数は式の最初の出現によって暗黙的に宣言されます。
Cでは、関数がそれ以外のint
ものを返す場合は、コードの最初の例のように、呼び出し元の関数内で関数を宣言することをお勧めします。
しかし、プロトタイプを作成するようにコンパイラーによって常に制約されます。その理由は、main()
関数の下で宣言されているため、関数が誰であるかがわからないためです。
問題は、これら2つは同等ですか?プロトタイプを作成するか、内部で関数を明示的に宣言main()
すると、必要な結果が返されますか?この2つの方法のいずれかを常に使用するように制約されている場合、どうすれば悪い値を返すことができますか?
main()
)
main()
ます。main()
例えば:
int main()
{
double doSomething(int a);
printf("%d", doSomething(2) );
}
double doSomething(int a)
{
return a * 2.0;
}
vs
double doSomething(int a);
int main()
{
printf("%d", doSomething(2) );
}
double doSomething(int a)
{
return a * 2.0;
}
このスレッドはほとんど私が必要としていたものですが、私のすべての質問に答えることはできませんでした。C言語-関数プロトタイプなしで関数を呼び出す
これらの2つの宣言は、最初のケースでdoSomething
main以外の他の関数で関数が必要になるまでは同等です。
このコードスニペットでは
int main()
{
double doSomething(int a);
//..
関数の関数プロトタイプがありますdoSomething
。
C標準から
関数プロトタイプは、パラメーターのタイプを宣言する関数の宣言です。
つまり、宣言でもある関数定義の前に、関数の名前はmainのブロックスコープでのみ表示されます。
次のプログラムを検討してください
#include <stdio.h>
void g( void )
{
f( 20 );
}
int main(void)
{
void f( int );
f( 10 );
return 0;
}
void f( int x )
{
printf( "x = %d\n", x );
}
コンパイラはこのステートメントに対してエラーを発行します
f( 20 );
名前fがまだ宣言されていないためです。
しかし、この声明
f( 10 );
mainのブロックスコープ内の名前はすでに宣言されているため、正しいです。
より明確にするために、関数には、ストレージクラス指定子なしでブロックスコープで宣言された変数とは反対のリンケージが常にあることを考慮に入れてください。
したがって、この宣言は主に
double doSomething(int a);
宣言と同等です
extern double doSomething(int a);
また、関数が最初にブロックスコープで宣言されている場合でも、リンカは関数定義を見つけます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加