こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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はすべきではないとなんかの本で読んだのですが・・。

投稿日時 - 2006-10-02 02:06:51

QNo.2445252

暇なときに回答ください

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

通称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は言語仕様的には正しくない。(でも動くものもある)

投稿日時 - 2006-10-02 02:30:40

お礼

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

投稿日時 - 2006-10-02 15:32:25

ANo.2

このQ&Aは役に立ちましたか?

17人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.7

基本的には#5の回答の通りです。ただし、それはフルスペックの仕様を持つOS上で動作することを前提とした「ホスト環境」の場合の話です。

組み込み用途で使用する処理系は(LinuxやWindowsなどを除けば)、OSに依存しない「フリースタンディング環境」になります。フリースタンディング環境では、プログラムの開始時に呼ばれる関数の型と名前は処理系定義です(つまり、void main()でもOK)。

ちなみに、OSであってもμITRONのような環境は、一般にはホスト環境ではなく、フリースタンディング環境に分類されます。
なお、C++では、ホスト環境(hosted environment)とフリースタンディング環境(freestanding environment)ではなく、依存処理系(hosted implementation)と自立処理系(freestanding implementation)という表現を用いているようです。

投稿日時 - 2006-10-02 11:33:52

ANo.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 を書かなくてもいいです。

投稿日時 - 2006-10-02 03:53:10

ANo.5

CおよびC++の言語仕様(ISO/IEC9899とISO/IEC14882)自体には、envpというものはありません。
# 前述の2例とその"同等指定"(argv が char** argvとか)以外は載ってません。

envpは、C言語仕様から見ると、処理系の独自定義に過ぎません。
勿論、処理系依存の話ではそれが正しい処理系もありますし、
実際にはサポートしてる処理系も多いですが、サポートしてないものも多々あります。
環境を特定せずC言語としてみた場合、仮にサポートしていなくても正しい処理系で、正しいコードです。
# envpを使うと、処理系依存になります。

投稿日時 - 2006-10-02 03:01:52

ANo.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++としても)正しい形式です。

投稿日時 - 2006-10-02 02:48:01

ANo.3

さらに正しくは、int main(int argc, char *argv[], char *envp[])になります。ただ、環境変数envpについては、一部の処理系(CP/Mやホスト系)ではサポートしていなかった事例もあります。

void main(void)は癖の悪いプログラミングですので、忘れてください。これで飛ぶOSは無いと思いますが、戻り値をスタックに積むようなOSだとまずいことになるかも。

投稿日時 - 2006-10-02 02:34:45

ANo.1

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

投稿日時 - 2006-10-02 02:17:02