関数のプロトタイプは、呼び出し元のルーチンで関数を宣言するのと似ていますか?

CătălinaSîrbu

関数プロトタイプがない場合、関数は式の最初の出現によって暗黙的に宣言されます。

Cでは、関数がそれ以外のintものを返す場合は、コードの最初の例のように、呼び出し元の関数内で関数を宣言することをお勧めします

しかし、プロトタイプを作成するようにコンパイラーによって常に制約されます。その理由は、main()関数の下で宣言されているため、関数が誰であるかがわからないためです

問題は、これら2つは同等ですか?プロトタイプを作成するか、内部で関数を明示的に宣言main()する必要な結果返されますか?この2つの方法のいずれかを常に使用するように制約されている場合、どうすれば悪い値を返すことができますか?

  1. 関数が呼び出し元の関数と同じスクリプトで宣言されている場合(ここmain()
    • プロトタイプ
    • で明示的に関数を宣言しmain()ます。
  2. 関数が別のファイルで宣言されている場合
    • プロトタイプ
    • で明示的に関数を宣言する 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つの宣言は、最初のケースでdoSomethingmain以外の他の関数で関数が必要になるまでは同等です。

このコードスニペットでは

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]

編集
0

コメントを追加

0

関連記事

分類Dev

関数型プログラミングでは、関数は、そのスコープ外で宣言され、パラメーターとして渡されなかった別の関数を呼び出すことができますか?

分類Dev

JavaScript:なぜ関数を呼び出すのではなく、プロトタイプを使用して関数を呼び出すのですか?

分類Dev

プロトタイプで定義しているときに関数を呼び出せないのはなぜですか?

分類Dev

1つのファイルで宣言され、他のファイルから呼び出されるPHPのパラメーターを使用して、再利用可能な関数をプログラムするにはどうすればよいですか?

分類Dev

Javascriptの_this、さまざまなタイプの関数呼び出し、および関数内で関数を呼び出す方法を理解していますか?

分類Dev

onclickイベントで関数を使用し、ループを使用して関数内の配列から関数をカウントすることにより、複数のJavaScript関数を呼び出す方法は?

分類Dev

Azure関数を呼び出してスノーフレークのプロシージャを呼び出してデータをロードすると、消費プランでタイムアウトが発生しますが、これを実現する別の方法はありますか?

分類Dev

関数は、呼び出し元のスコープを使用する必要があることを宣言するための方法はありますか?

分類Dev

Cなどの他のシステムプログラミング言語での関数の通常の使用と比較して、Rustスタイルのメソッド呼び出しアプローチにオーバーヘッドはありますか?

分類Dev

関数のローカル変数を呼び出し元の環境にバインドできますか?

分類Dev

マルチネストイベント関数でスクリプトを呼び出すと、コードがハングするのはなぜですか

分類Dev

これは、疑似ジェネリック関数ポインターによって異なるプロトタイプの関数を呼び出すことを許可されていますか?

分類Dev

Goroutineは、ポインターのある関数でループを呼び出して値を上書きしますか?

分類Dev

snake_caseを使用してCamelCaseプロトタイプ関数を呼び出すことができるのはなぜですか?

分類Dev

関数をインポートして、呼び出し元のスコープを使用します

分類Dev

Javascriptはコンストラクター内の関数からプロトタイプ関数を呼び出します

分類Dev

通常の関数を渡してテンプレート関数を呼び出す方法はありますか?

分類Dev

foreachループ内で関数を呼び出して、エラーの再宣言を回避するにはどうすればよいですか?

分類Dev

変数のタイプに応じて異なる関数を呼び出すときの正しいフロータイプパターンは何ですか?

分類Dev

パイピングマップが元の関数を呼び出そうとしています

分類Dev

JSONデプロイメントテンプレートの外部でARMテンプレート関数を呼び出すことはできますか?

分類Dev

この関数とその呼び出しへのアプローチに対して、私は何を間違って行っていますか?

分類Dev

コンストラクターは、現在のクラスタイプを使用している関数を呼び出しています

分類Dev

プロトコルを介して別のUIViewControllerから関数を呼び出そうとしていますが、デリゲートでnilを取得しています-ここではどうなるでしょうか?

分類Dev

Cの関数呼び出しでプリインクリメントを使用するのは間違っていますか?

分類Dev

マルチプロセッシングによって呼び出された関数がメッセージを出力しないのはなぜですか?

分類Dev

エラーヘルプ-UnityException:変数を宣言するときにこの関数を呼び出すことは許可されていません

分類Dev

JavaScriptの関数をObjectのインスタンスとして呼び出すことはできますか?

分類Dev

マルチプロセッシングを使用して、forループで、引数が異なる同じ関数への2つの呼び出しを並列化するにはどうすればよいですか?

Related 関連記事

  1. 1

    関数型プログラミングでは、関数は、そのスコープ外で宣言され、パラメーターとして渡されなかった別の関数を呼び出すことができますか?

  2. 2

    JavaScript:なぜ関数を呼び出すのではなく、プロトタイプを使用して関数を呼び出すのですか?

  3. 3

    プロトタイプで定義しているときに関数を呼び出せないのはなぜですか?

  4. 4

    1つのファイルで宣言され、他のファイルから呼び出されるPHPのパラメーターを使用して、再利用可能な関数をプログラムするにはどうすればよいですか?

  5. 5

    Javascriptの_this、さまざまなタイプの関数呼び出し、および関数内で関数を呼び出す方法を理解していますか?

  6. 6

    onclickイベントで関数を使用し、ループを使用して関数内の配列から関数をカウントすることにより、複数のJavaScript関数を呼び出す方法は?

  7. 7

    Azure関数を呼び出してスノーフレークのプロシージャを呼び出してデータをロードすると、消費プランでタイムアウトが発生しますが、これを実現する別の方法はありますか?

  8. 8

    関数は、呼び出し元のスコープを使用する必要があることを宣言するための方法はありますか?

  9. 9

    Cなどの他のシステムプログラミング言語での関数の通常の使用と比較して、Rustスタイルのメソッド呼び出しアプローチにオーバーヘッドはありますか?

  10. 10

    関数のローカル変数を呼び出し元の環境にバインドできますか?

  11. 11

    マルチネストイベント関数でスクリプトを呼び出すと、コードがハングするのはなぜですか

  12. 12

    これは、疑似ジェネリック関数ポインターによって異なるプロトタイプの関数を呼び出すことを許可されていますか?

  13. 13

    Goroutineは、ポインターのある関数でループを呼び出して値を上書きしますか?

  14. 14

    snake_caseを使用してCamelCaseプロトタイプ関数を呼び出すことができるのはなぜですか?

  15. 15

    関数をインポートして、呼び出し元のスコープを使用します

  16. 16

    Javascriptはコンストラクター内の関数からプロトタイプ関数を呼び出します

  17. 17

    通常の関数を渡してテンプレート関数を呼び出す方法はありますか?

  18. 18

    foreachループ内で関数を呼び出して、エラーの再宣言を回避するにはどうすればよいですか?

  19. 19

    変数のタイプに応じて異なる関数を呼び出すときの正しいフロータイプパターンは何ですか?

  20. 20

    パイピングマップが元の関数を呼び出そうとしています

  21. 21

    JSONデプロイメントテンプレートの外部でARMテンプレート関数を呼び出すことはできますか?

  22. 22

    この関数とその呼び出しへのアプローチに対して、私は何を間違って行っていますか?

  23. 23

    コンストラクターは、現在のクラスタイプを使用している関数を呼び出しています

  24. 24

    プロトコルを介して別のUIViewControllerから関数を呼び出そうとしていますが、デリゲートでnilを取得しています-ここではどうなるでしょうか?

  25. 25

    Cの関数呼び出しでプリインクリメントを使用するのは間違っていますか?

  26. 26

    マルチプロセッシングによって呼び出された関数がメッセージを出力しないのはなぜですか?

  27. 27

    エラーヘルプ-UnityException:変数を宣言するときにこの関数を呼び出すことは許可されていません

  28. 28

    JavaScriptの関数をObjectのインスタンスとして呼び出すことはできますか?

  29. 29

    マルチプロセッシングを使用して、forループで、引数が異なる同じ関数への2つの呼び出しを並列化するにはどうすればよいですか?

ホットタグ

アーカイブ