• ベストアンサー

int main()、void main()、void main(void)、int main(void)

今日、大学でC言語の講義の時間、先生が、 #include <stdio.h> void main(void){ } と宣言してプログラムを書くと教えていました。 main関数には、 main() void main() void main( void ) int main() int main( void ) と、人によりいくつかの描き方があったりします。 どれが本当は正しいのでしょうか? void mainはすべきではないとなんかの本で読んだのですが・・。

質問者が選んだベストアンサー

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.2

通称C89という以前の言語規格(現行コンパイラの多くが準拠)では、下記のいずれかが正しい。 int main(int argc, char *argv[]) int main(void) 但し、最新のC言語規格(通称C99)では、 <ISO/IEC9899:1999> or in some other implementation-defined manner. </ISO/IEC9899:1999> となっているので、処理系が戻り値のvoidを認めていればvoidも可。 # 組込み系などで戻り値を使わない環境もあるためでしょうか。 なので、コンパイラのマニュアルで戻り値のvoidにしていい/しろと書いてない限り、 voidは言語仕様的には正しくない。(でも動くものもある)

amazontester
質問者

お礼

なるほど。皆さんありがとうございます! とても勉強になりました。

その他の回答 (6)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.7

基本的には#5の回答の通りです。ただし、それはフルスペックの仕様を持つOS上で動作することを前提とした「ホスト環境」の場合の話です。 組み込み用途で使用する処理系は(LinuxやWindowsなどを除けば)、OSに依存しない「フリースタンディング環境」になります。フリースタンディング環境では、プログラムの開始時に呼ばれる関数の型と名前は処理系定義です(つまり、void main()でもOK)。 ちなみに、OSであってもμITRONのような環境は、一般にはホスト環境ではなく、フリースタンディング環境に分類されます。 なお、C++では、ホスト環境(hosted environment)とフリースタンディング環境(freestanding environment)ではなく、依存処理系(hosted implementation)と自立処理系(freestanding implementation)という表現を用いているようです。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.6

C言語的にどれが正しいということはありません。 そのプログラムが動く環境に依存します。 引数を使わないとして、DOS/Windows/Unix/Linuxの場合は、 int main(void) もしくは main(void) /* intがデフォルトなので */ が正しく、void main()、void main(void) は間違い。厳密にはコンパイラ依存ですが、void main(void) と書くのが正しいメジャーなコンパイラは無いです。 家電機器等の組み込みのプログラムなら、場合によっては void main(void) と書くように指示されているかもしれません。 なお、ANSI-C 準拠のCで無ければ 引数部の void を書かなくてもいいです。

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.5

CおよびC++の言語仕様(ISO/IEC9899とISO/IEC14882)自体には、envpというものはありません。 # 前述の2例とその"同等指定"(argv が char** argvとか)以外は載ってません。 envpは、C言語仕様から見ると、処理系の独自定義に過ぎません。 勿論、処理系依存の話ではそれが正しい処理系もありますし、 実際にはサポートしてる処理系も多いですが、サポートしてないものも多々あります。 環境を特定せずC言語としてみた場合、仮にサポートしていなくても正しい処理系で、正しいコードです。 # envpを使うと、処理系依存になります。

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.4

誤解を与えそうなので補足。 つまり、C99に準拠した処理系(例えばVCとかは違います)で、 コンパイラのマニュアルにvoid main でいいと書いてある場合以外は、void mainは不正。 もしvoidが必須なC99の処理系だったとしても、 少なくとも講義で説明も無く教えるのは不適切でしょう。先生がよくわかってない可能性が大。 main() : 戻り値省略は確かにintですが、これ自体が非推奨です。 void main() : 前述の理由で、おそらく不正です。 void main( void ) : 同様に、おそらく不正です。 int main() : C++ (ISO/IEC14882)では、規格書にも載っている正しい形式です。     ※Cと違い、C++ では引数の void を省略したと看做されます。 int main( void ) : C言語として(C++としても)正しい形式です。

  • ultraCS
  • ベストアンサー率44% (3956/8947)
回答No.3

さらに正しくは、int main(int argc, char *argv[], char *envp[])になります。ただ、環境変数envpについては、一部の処理系(CP/Mやホスト系)ではサポートしていなかった事例もあります。 void main(void)は癖の悪いプログラミングですので、忘れてください。これで飛ぶOSは無いと思いますが、戻り値をスタックに積むようなOSだとまずいことになるかも。

  • fxdwg99
  • ベストアンサー率45% (43/94)
回答No.1

正しくは、int main(int argc, char *argv[])です。 main関数の戻り値をコマンドプロンプトやシェルスクリプトが 利用しますので、mainの戻り値voidはあり得ません。 main()と書いた場合、戻り値が省略されているので暗黙でintになります。

関連するQ&A