2017-12-10 5 views
1
int func (int,int); 

int main() 
{ 
    printf("hello"); 
} 

上記の機能を考慮してください。 funcのような関数を定義する目的は何ですか?私はこれを繰り返し見ました。このような関数を定義する目的は何ですか?

+1

これは関数定義ではなく、**関数プロトタイプ**です。 Prototypesは、コンパイラが他の場所で(つまりオブジェクトライブラリ内で)定義できる関数を使用できるようにする最小限の情報を報告します。プロトタイプから関数が返すものと取得するパラメータを知ることで、それをコードに正しくリンクさせることができます。 –

+3

Cプログラムの「プロトタイプ」とは何か?(https://stackoverflow.com/questions/23661729/what-are-prototypes-in-ac-program) –

答えて

0

関数定義ではありませんが、関数宣言です。関数宣言は、関数が持つパラメータの数、関数のパラメータの型、関数の戻り値の型をコンパイラに通知します。

1) It tells the return type of the data that the function will return.

2) It tells the number of arguments passed to the function.

3) It tells the data types of the each of the passed arguments.

4) Also it tells the order in which the arguments are passed to the function.

5) It tells the name (identifier) of the function.

+0

5)名前(識別子)を指定します。 – iBug

+0

@iBugありがとうございました。私が追加しました。 – rsp

1
int func(int, int); 

関数を定義しますが、そのプロトタイプを提供することで、それを宣言していません。これは、最新のリンカーがそのような関数を公開するモジュールを提供するという、コンパイラーにとっての "約束"です。

関数のプロトタイプは、そのカバー:

  • 戻り値の型
  • を名前
  • タイプと引数の順序

引数の名前はに関連していません宣言のコンテキスト

関数の引数の名前はこれだけのように見えるかもしれない、機能の実装のために提供する必要があります一方

int func(int a, int b) 
{ 
    return a + b; 
} 

この

int func(int a, int) 
{ 
    return a; 
} 

ではありません有効

C規格が明確に述べて:

6.9.1/5 Function definitions

If the declarator includes a parameter type list, the declaration of each parameter shall include an identifier, except for the special case of a parameter list consisting of a single parameter of type void, in which case there shall not be an identifier. No declaration list shall follow.

+2

この「無効な」コードをコンパイルしようとしましたか?それは有効に見えます。実装でパラメータの名前を指定しないと、 "未使用のパラメータ"警告を抑制するためのテクニックが使用されます。 – RSFalcon7

+0

@ RSFalcon7: 'int func(int a、int)をコンパイルしようとします。 { return a; } 'のようなエラーが発生することがあります。少なくともCでは' error:parameter name omitted'がC++については不明です。 – alk

+0

@ RSFalcon7: "*"未使用のパラメータ "を抑制するのに使用する警告*"これはベンダー固有のC標準への拡張だと考えています。間違っていると私はCスタンダードの関連部分を引用してください。 – alk

0

は、これは名前funcを持つ関数が最後に定義を持つ存在コンパイラに指示する機能のほんの関数宣言です。
この例を考えてみましょう:

#include<stdio.h> 
    int func (int,int); 
    int main() 
    { 
     printf("hello\n"); 
     int c= func(5,4); 
     printf("%d\n",c); 

    } 
    int func(int a, int b) 
    { 

     return a+b; 
    } 
+2

Bro。コードをフォーマットしてください。 – iBug

+0

'return'は関数ではありません。引数をかっこにする必要はありません。 – alk

+2

正式には間違っているわけではなく、 'return((a)+(b));と間違っていても間違いではありません。 – alk

1

他のすべての答えは、明示的に正しいの質問に答えていないので、私はここに1を追加しています。

まず、本体がないため、の定義ではありません。この意味は関数宣言と呼ばれます。

関数を呼び出す前に、コンパイラは関数が正確に何であるかを知る必要があります。これは「プロトタイプ」と呼ばれます。プロトタイプは、関数を呼び出すための正しいコードを生成する前に知っていなければなりません。このコードを考えてみましょう:

// No previous info 
int a = func(1, 3); 

それはint func(int, int)またはlong func(char, double)を呼び出している場合、コンパイラは知りません、また実際の関数がFILE* func(void*)ある場合には、エラーチェックを実行することができます。

正しいプロトタイプを公開しないと、コンパイラは必要なチェックを行い、その関数呼び出しの対応するコードを生成できます。

関連する問題