
今日、大学でC言語の講義の時間、先生が、
#include <stdio.h>
void main(void){
}
と宣言してプログラムを書くと教えていました。
main関数には、
main()
void main()
void main( void )
int main()
int main( void )
と、人によりいくつかの描き方があったりします。
どれが本当は正しいのでしょうか?
void mainはすべきではないとなんかの本で読んだのですが・・。
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は言語仕様的には正しくない。(でも動くものもある)
No.7
- 回答日時:
基本的には#5の回答の通りです。
ただし、それはフルスペックの仕様を持つOS上で動作することを前提とした「ホスト環境」の場合の話です。組み込み用途で使用する処理系は(LinuxやWindowsなどを除けば)、OSに依存しない「フリースタンディング環境」になります。フリースタンディング環境では、プログラムの開始時に呼ばれる関数の型と名前は処理系定義です(つまり、void main()でもOK)。
ちなみに、OSであってもμITRONのような環境は、一般にはホスト環境ではなく、フリースタンディング環境に分類されます。
なお、C++では、ホスト環境(hosted environment)とフリースタンディング環境(freestanding environment)ではなく、依存処理系(hosted implementation)と自立処理系(freestanding implementation)という表現を用いているようです。
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 を書かなくてもいいです。
No.5
- 回答日時:
CおよびC++の言語仕様(ISO/IEC9899とISO/IEC14882)自体には、envpというものはありません。
# 前述の2例とその"同等指定"(argv が char** argvとか)以外は載ってません。
envpは、C言語仕様から見ると、処理系の独自定義に過ぎません。
勿論、処理系依存の話ではそれが正しい処理系もありますし、
実際にはサポートしてる処理系も多いですが、サポートしてないものも多々あります。
環境を特定せずC言語としてみた場合、仮にサポートしていなくても正しい処理系で、正しいコードです。
# envpを使うと、処理系依存になります。
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++としても)正しい形式です。
No.3
- 回答日時:
さらに正しくは、int main(int argc, char *argv[], char *envp[])になります。
ただ、環境変数envpについては、一部の処理系(CP/Mやホスト系)ではサポートしていなかった事例もあります。void main(void)は癖の悪いプログラミングですので、忘れてください。これで飛ぶOSは無いと思いますが、戻り値をスタックに積むようなOSだとまずいことになるかも。
No.1
- 回答日時:
正しくは、int main(int argc, char *argv[])です。
main関数の戻り値をコマンドプロンプトやシェルスクリプトが
利用しますので、mainの戻り値voidはあり得ません。
main()と書いた場合、戻り値が省略されているので暗黙でintになります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングペーパーテスト 次の問題の実行結果を答えろ #include int x[ ] = { 1 2022/06/16 21:49
- C言語・C++・C# プログラミングの授業のペーパーテスト 実行結果を答えろ #include int x[ ] = {1 3 2022/06/16 20:08
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# プログラミング実行後の表示される値を答えよ #include<stdio.h> void main( 7 2022/05/20 00:07
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
戻り値を返す関数の前に(void)...
-
既定のコンストラクタがありま...
-
C#でテンキーの操作は可能でし...
-
多重定義が起きている?--lnk20...
-
静的でないメンバ関数の呼び出...
-
リージョンのフレームを描画す...
-
関数名の名前の衝突について。
-
C++にてtemplateで受け取った任...
-
DLLの関数呼び出しで引数がある...
-
C言語 extern について
-
C言語 int main(void) main()
-
privateなnamespaceメンバ
-
関数の戻り値にその関数のポイ...
-
PowerShellにてツリービュー入...
-
Aの値からBの値を除するとは??
-
fgetsなどのときのstdinのバッ...
-
「指定されたキャストは有効で...
-
Enterキーを押されたら次の処理...
-
java初心者です。入力されたの...
-
C言語のステップ数をカウントす...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
多重定義が起きている?--lnk20...
-
const_castのつかいどころを教...
-
C++にてtemplateで受け取った任...
-
既定のコンストラクタがありま...
-
戻り値を返す関数の前に(void)...
-
静的でないメンバ関数の呼び出...
-
int main()、void main()、void...
-
C# KeyDownイベントでショート...
-
C# Controls.Addで動的に配置し...
-
(void)0 はどんな意味ですか
-
gcc: incompatible pointer type
-
_beginthreadにて発生するコン...
-
C#でラジオボタンを設定に記録...
-
C#でテンキーの操作は可能でし...
-
C++別のオブジェクトからメンバ...
-
CTabCtrl:TABインデックス単位...
-
見た目は同じソースなのにエラ...
-
pictureboxの画像を削除するには?
-
【VC++6.0】イベントハンドラ関...
おすすめ情報