実際の関数定義と比較して、パラメータのない関数がコンパイルされるのはなぜですか? 質問する

実際の関数定義と比較して、パラメータのない関数がコンパイルされるのはなぜですか? 質問する

誰かの C コードに遭遇したのですが、なぜコンパイルされるのかわかりません。理解できない点が 2 つあります。

  1. 関数プロトタイプには、実際の関数定義と比較してパラメーターがありません。

  2. 関数定義内のパラメータに型がありません。


#include <stdio.h>

int func();

int func(param)
{
    return param;
}

int main()
{
    int bla = func(10);    
    printf("%d", bla);
}

なぜこれが機能するのでしょうか? いくつかのコンパイラでテストしましたが、問題なく動作します。

ベストアンサー1

他の答えはすべて正解ですが、完了

関数は次のように宣言されます。

  return-type function-name(parameter-list,...) { body... }

戻り型は、関数が返す変数の型です。配列型や関数型にすることはできません。指定しない場合は、int であるとみなされます

function-name は関数の名前です。

パラメータ リストは、関数が受け取るパラメータのリストで、カンマで区切られます。パラメータが指定されていない場合、関数はパラメータを受け取らないため、空の括弧またはキーワード void を使用して定義する必要があります。パラメータ リスト内の変数の前に変数型が指定されていない場合は、int であると想定されます。配列と関数は関数に渡されませんが、自動的にポインタに変換されます。リストが省略記号 (,...) で終了している場合、パラメータの数は決まっていません。注: 省略記号を使用する場合、ヘッダー stdarg.h を使用して引数にアクセスできます。

完全を期すためにもう一度。C11仕様6:11:6より(ページ: 179)

空の括弧を持つ関数宣言子(プロトタイプ形式のパラメータ型宣言子ではない)の使用は、廃止予定の機能です

おすすめ記事