10

C標準は言う:

プログラムの起動時に呼び出される関数の名前はmainです。実装は、この関数のプロトタイプを宣言していません。これは、intの戻り型で、パラメーターなしで定義されるものとします。

int main(void) { /* ... */ }

または2つのパラメーターを使用します(ここではargcおよびargvと呼びますが、宣言されている関数に対してローカルであるため、任意の名前を使用できます)。

int main(int argc, char *argv[]) { /*
... */ }

または同等のもの、またはその他の実装定義の方法。

ただし、Kernighan&Ritchieの第2版(正規のANSI C)の聖書では、次のものを使用しています。

main()
{
  /* taram pampam ... */

  return 0;
}

誰が正しいですか?int戻り値が自動的にCで返されると想定されていない関数と関係がありますか?

4

4 に答える 4

16

ANSI C が必要な場合は、定義上、標準が適切です。

C89/C90 では、int戻り値の型が暗示されているため、K&R の定義は受け入れられます。

C99 では、これはもはや当てはまりません。

C90 標準には、次の文言 (5.1.2.2.1 プログラムの起動) があります。これは、C99 の文言と非常によく似ています (おそらく最も重要なのは、「shall」の代わりに強度の低い「can」を使用することです)。

プログラムの起動時に呼び出される関数の名前はmainです。実装は、この関数のプロトタイプを宣言していません。パラメータなしで定義できます。

int main(void) { /* ... */ }

または 2 つのパラメーター (ここではargcおよびと呼ばれますargvが、宣言されている関数に対してローカルであるため、任意の名前を使用できます):

int main(int argc, char *argv[]) { /* ... */ }

それらが定義されている場合、main関数のパラメーターは次の制約に従う必要があります。

[等。...]

そのセクションには、戻り値の型を除外するとデフォルトが になるという事実について直接言及していませんint

率直に言って、その動作が標準で指定されている場所を正確に見つけるのに苦労しています。最も近いのは 6.7.1 (関数定義) で、関数定義の文法は「宣言指定子」がオプションであることを示しており、例は次のように述べています。

例:

  1. 以下では:

      extern int max(int a, int b)
      {
          return a > b ? a : b;
      }
    

    externはストレージ クラス指定子でintあり、型指定子です (これらはデフォルトであるため、それぞれを省略できます)...

于 2009-11-19T18:56:22.367 に答える
4

はい、C89 (元の C 標準) では、関数が戻り値の型なしで宣言されている場合、 return と見なされintます。C99 では、すべての関数で明示的な戻り値の型が必要です。

于 2009-11-19T18:56:30.230 に答える
3

また、main() と main(void) の間には (少なくとも宣言では) 微妙な違いがあります --

main()

(暗黙的に) int を返し、指定されていない数の引数を取る関数です。

main(void)

引数を取らない。

于 2009-11-19T19:06:24.293 に答える
0

私が持っている K&R のバージョンは 1988 年に印刷されたものです。標準はそれまでに出ていなかったので、いくつかの矛盾があります。ただし、第 2 版のほとんどは C89 規格に準拠しています。

C89 標準(Google の YAY)のテキスト バージョンを見つけました。それは言います:

「プログラム起動」

プログラムの起動時に呼び出される関数の名前は main です。実装は、この関数のプロトタイプを宣言していません。パラメータなしで定義できます。

     int main(void) { /*...*/ }

または 2 つのパラメーター (ここでは argc および argv と呼ばれますが、宣言されている関数に対してローカルであるため、任意の名前を使用できます):

     int main(int argc, char *argv[]) { /*...*/ }
于 2009-11-19T19:14:52.627 に答える