1. ホーム
  2. c

[解決済み] 実際の関数定義と比較して)パラメータがない関数がコンパイルされるのはなぜですか?

2022-03-23 09:32:15

質問

ある人のC言語のコードに出会ったのですが、なぜかコンパイルできてしまうので困っています。理解できない点が2つあります。

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

  2. のパラメータは 関数定義 が型を持っていない。


#include <stdio.h>

int func();

int func(param)
{
    return param;
}

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

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

どのように解決するのですか?

他の回答はすべて正しいのですが、唯一 完成

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

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

リターンタイプ は、その関数が返す変数の型です。これは、配列型や関数型にはできません。 指定されない場合は、int が想定されます。 .

関数名 は関数の名前です。

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

そして、念のためもう一度。 C11仕様6:11:6より (ページ: 179)

関数宣言子を空の括弧で囲んでしまう (ではない プロトタイプ形式のパラメータ型宣言子) は時代遅れです。 機能 .