1. ホーム
  2. c

C言語のmain()関数の有効なシグネチャは何ですか?

2023-09-02 23:39:40

質問

C言語のmain関数の有効なシグネチャは何ですか?私は知っています。

int main(int argc, char *argv[])

他に有効なものはありますか?

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

この C11 規格では、この二つについて明示的に言及しています。

int main(void);
int main(int argc, char* argv[]);

は、以下の脚注で "or equivalent" というフレーズに言及していますが。

このように int に置き換えることができます。 typedef という名前で定義されています。 int のタイプ、または argv は次のように書くことができる。 char ** argv といった具合になります。

さらに、より多くの(実装上定義された)可能性を提供するものでもあります。

関連するテキスト(セクション 5.1.2.2.1 から、この特定の側面は変更されていません。 C99 ) の状態になります。

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

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

または2つのパラメータ(ここでは argcargv しかし、それらは宣言された関数に局所的であるため、どのような名前でも使用することができます)。

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

またはそれと同等の方法、あるいは他の実装で定義された方法で行います。

それらが宣言されている場合、パラメータは main 関数へのパラメータは,次の制約に従わなければならない。

  • の値は argc は非負でなければならない。

  • argv[argc] はヌルポインタでなければならない。

  • の値が argc の値が 0 よりも大きい場合、配列のメンバ argv[0] を通して argv[argc-1] は,プログラム起動前にホスト環境によって実装定義された値が与えられる文字列へのポインタを含まなければならない。これは,ホスト環境内の他の場所からプログラム起動前に決定された情報をプログラムに供給することを意図している。ホスト環境が大文字と小文字の両方を含む文字列を提供することができない場合,実装は,文字列が小文字で受信されることを保証しなければならない。

  • の値が argc の値が0より大きい場合、その文字列は argv[0] が指す文字列はプログラム名を表します。 argv[0][0] は,ホスト環境からプログラム名を利用できない場合には,ヌル文字とする。もし argc の値が1より大きい場合は argv[1] を通して argv[argc-1] はプログラムのパラメータを表す。

  • パラメータは argcargv で指される文字列と argv の配列が指す文字列は,プログラムによって変更可能であり,プログラムの起動から終了までの間,最後に格納された値を保持しなければならない。

これはホスト環境、つまりCプログラムで通常見られるような環境での話であることに注意してください。独立した環境(組み込みシステムなど)では、以下のように制約が少なくなります。 5.1.2.1 で述べられているように、はるかに制約が少なくなります。

フリースタンディング環境(Cプログラムの実行がオペレーティングシステムの恩恵を受けずに行われる可能性がある)では、プログラム起動時に呼び出される関数の名前と型は実装で定義されている。第4節で要求される最小限のセット以外の、自立型プログラムで利用可能なあらゆるライブラリ機能は、実装で定義されるものである。