今日、大学で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も見ています
-
見学に行くとしたら【天国】と【地獄】どっち?
みなさんは、一度だけ見学に行けるとしたら【天国】と【地獄】どちらに行きたいですか? 理由も聞きたいです。
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
【お題】逆襲の桃太郎
【大喜利】桃太郎が1回鬼退治に失敗したところから始まる新作昔話「リベンジオブ桃太郎」にはこんなシーンがある
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
静的でないメンバ関数の呼び出...
-
C# Controls.Addで動的に配置し...
-
【gcc・cygwin】multiple defin...
-
多重定義が起きている?--lnk20...
-
LEDで電光掲示板に「A B C D E...
-
typedef unsigned int UINT;が...
-
Notepad++の関数リスト表示の変...
-
C++にてtemplateで受け取った任...
-
string型とsbyte*型の変換
-
PowerShellにてツリービュー入...
-
組み込みマイコン
-
既定のコンストラクタがありま...
-
ソケット通信時のWSACleanup処...
-
関数ポインタについて
-
const_castのつかいどころを教...
-
ウインドウの移動禁止
-
C#でラジオボタンを設定に記録...
-
Opengl+jpeglibでC3867エラー
-
【VC++6.0】イベントハンドラ関...
-
プログラムを教えてください。...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
静的でないメンバ関数の呼び出...
-
C++にてtemplateで受け取った任...
-
多重定義が起きている?--lnk20...
-
既定のコンストラクタがありま...
-
C# Controls.Addで動的に配置し...
-
戻り値を返す関数の前に(void)...
-
const_castのつかいどころを教...
-
C# KeyDownイベントでショート...
-
void*型の配列について
-
int main()、void main()、void...
-
typedef unsigned int UINT;が...
-
(void)0 はどんな意味ですか
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
gcc: incompatible pointer type
-
ウインドウの移動禁止
-
VC++でGetKeyboardStateがうま...
-
マルチメディアタイマーの使用方法
-
C#でテンキーの操作は可能でし...
-
C/C++でのScene管理について
おすすめ情報