1

今日、Clangはプログラムをコンパイルしようとして、ちょっと奇妙なメッセージをくれました。私はCの経験があまりないので、何か間違ったことをしている可能性がありますが、実際に試したコードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>

int sum(a,b);

int main ()
{
    printf(sum(1,2));
    return 0;
}

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

お気づきかもしれませんが、関数'sum'を宣言するときは、paramを含めていません。タイプなので、エラーが予想されますが、Clangが私に与える実際のメッセージは次のとおりです。

ind.c:4:9: error: a parameter list without types is only allowed in a function definition
int sum(a,b);
        ^
ind.c:12:5: error: redefinition of 'sum' as different kind of symbol
int sum (int a, int b)
    ^
ind.c:4:5: note: previous definition is here
int sum(a,b);
    ^
2 errors generated.

Clangが関数定義でのみ許可されていると言っている場合、それはどういう意味ですか?int sum(a,b);関数定義ではありませんか?

4

2 に答える 2

6

いいえ、定義ではなくint sum(a, b);関数宣言です。

関数宣言は、コンパイラが関数の呼び出しを生成するのに十分な情報を提供します。定義は宣言を提供し、さらに、関数が呼び出されたときに実行されるコードを定義します ( と の間のもの{) }

関数宣言 (定義の一部ではない) には、名前だけでなく、パラメーターの型、または型とその名前を含めることができます。(型が含まれている場合、それはプロトタイプです。)

古いスタイルの関数定義では、パラメーターの名前だけを使用できます。次に例を示します。

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

しかし、古いスタイルの定義と宣言は時代遅れであり、避けるのが最善です。古いスタイルの宣言ではパラメーターの型の数が指定されていないため、コンパイラーは呼び出しの正確性を検証できません。

宣言次のようになります。

int sum();

しかし、次のようになります。

int sum(int a, int b);

またはこれさえ:

int sum(int, int);

ああ、とint main ()書いたほうがいいですint main(void)

于 2012-04-13T23:59:09.800 に答える
3

int sum();関数宣言です。関数に名前を付けますが、コンパイラに何をするかは伝えません。コンパイラーにそれが何をするかを伝えることは関数を定義することであり、それがそれが意味することです。セミコロンではなく、ステートメントを含む中括弧がある場合は、関数定義があります。

于 2012-04-13T23:53:02.607 に答える