
No.4ベストアンサー
- 回答日時:
結論から言えば「main関数の戻り値の型は処理系依存」です。
例えば「プログラムが返す終了ステータスは、0~65535の値を取り、負数や65536以上の値を返してはならない。負数および65536以上の値はOSがエラー値として使用する」と決められたOSがあったとします(このOSは架空のOSです)
「このOS用のプログラムを作成するコンパイラ」では「mainから戻り値が、プログラムが返す終了ステータスとなる」と言う仕様になっています。
すると、このコンパイラでは、main関数の仕様は、OS、つまりは処理系に依存した仕様である
unsigned short main(~~~)
となります。
もし、このコンパイラのintが32ビットだった場合、main関数が
int main(~~~)
だった場合に
return 65537;
とか書いてしまう事ができます。
でも、これは「OSの仕様を逸脱している」ので「やってはいけない事」です。
同様に「マイコン用のコンパイラなので、main関数が終了したらCPU停止命令で停止し、リセット信号が入力されるまでフリーズする」と言う仕様の処理系(つまり、質問者さんが書いた、main関数を呼んでる部分の仕様)では、main関数の仕様は
void main(~~~)
となります。
結論を言うと「実行環境の仕様に合ってさえいれば、mainはどう書いても良い」と言うことです。
因みに「C言語が発明された当時」は「C言語はUNIXで動くプログラムを作る為の物」だったので「mainの仕様がUNIX仕様」だった為に「mainはintを返す」と言う仕様でした。
そのため、他のOSや実行環境が増えた今も「初期の仕様を盲信し、mainはintを返すのだと信じて疑わない盲信者」が生息しているので注意しましょう。
回答有り難う御座います。
調べてみると、色々な事が有るようですね。
No.5のjacta さんの回答から読めることは、
void main(void) は、C99の規格には合っているが、C90では規格外。
「void main(void) と書いてある本は読むな!」と言うような過激な発言が間違いのようですね。
No.5
- 回答日時:
> 調べると、ANSI C の仕様では次の4通りが有るとなっています。
はい。ただし、その仕様はC99の場合です。
C90の場合、mainの返却値型がintでない場合の動作は未定義になります。
なお、フリースタンディング環境の場合には、プログラム開始位置の型や関数名は処理系定義になります(つまり、mainでなく、startとかbootとかの名前もあり得ます)。
いつも回答有り難う御座います。jactaさんは、規格を詳しくご存じですね。
void main(void) は規格外の間違いなのかと思って質問したのですが、結構奥が深いですね。
フリースタンディングとかC99などをウィキペディアで調べて、勉強になりました。
また何か質問したら、宜しくお願いします。
No.3
- 回答日時:
>返値の使い道が無い。
それは、あなたにとってたまたま使い道がないだけの話で、世の中には、それを必要とする場合があるということです。
というか、Cの規格が作られた当時は、プログラムは原則として値を返さなければならなかったのです。なので、規格もそのように決められました。
もし、当時から今のように、プログラムの返り値が不要な場合が多かったならば、規格ももう少し違ったものになっていたかもしれませんね。
でも、昔々のCって、voidがありませんでしたから。そっちの影響のほうが大きいかも。
いずれにせよ、規格に従うのは大事なことですので、return 0と書くべきなのは正しいと思います。
早速の回答有り難う御座います。
書き忘れましたが、マイコンのプログラムを作っています。そのため main() を呼ぶプログラムも自分で管理しています。
このような場合にも返値を書かなければ規格違反なのかと思った訳です。
No1,No2 のお礼に有るように、知りたい事が分かりました。
No1 の方に言われて色々と調べたところ、return 0 は正常終了の意味に多く使われると言う事も分かりました。
No.2
- 回答日時:
>返値の使い道が無い
Windowsを例として答えるとバッチファイルで値をチェックして処理を分岐する事ができます。つまり使い道があるワケです。
まぁ、最近の人はバッチファイルなんて使わないでしょうが・・・。
早速の回答有り難う御座います。
書き忘れましたが、マイコンのプログラムを作っています。
void main(void) とするのはC言語の仕様違反なのか調べたくて質問しました。
No.1 のお礼に有るように、組み込みだったら void main(void) としても違反では無さそうだと分かりました。
よく此処で回答して下さる下記の jacta さんの書き込みを見ても、C言語の仕様違反では無いと判断しました。
-----------------------------
質問番号:2074883 回答No5
また、mainの返却値型はint型が基本ですが、特定の状況では他の型、例えばvoid型の場合もあり得ます。その状況というのは、
1. 組み込み用の処理系など、フリースタンディング環境である場合、処理系定義の型となり得る。
-----------------------------
バッチファイルのコマンドを調べるため、MS-DOS時代の本は貴重ですね。大事に何冊か持っています。
No.1
- 回答日時:
返答するのも馬鹿馬鹿しいが、「教えて!検索」で「main」をキーワードに「このカテゴリーから検索」すると、参照URLに記載した質問に行きあたる。
。。参考URL:http://oshiete1.goo.ne.jp/qa2445252.html
検索方法を教えて頂いて有り難う御座います。
調べると、ANSI C の仕様では次の4通りが有るとなっています。
(1)int main(void) { /* ... */ }
(2)int main(int argc, char * argv[]) { /* ... */ }
(3)上の二つのいずれかと等価な方法
(4)上の三つのいずれでもない処理系定義の方法
WINDOWSなどのOSの元で動かすなら(1),(2)、(3)なのでしょうが、組み込み用の処理系などフリースタンディング環境である場合は(4)になると思います。
void main(void) としても、組込用であれば(4)を選択でき、C言語の仕様に違反していないと判断しました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# C言語 3 2022/10/04 15:07
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C言語初心者です、、、お助けください 2 2023/03/14 20:08
- C言語・C++・C# 10人分の生徒の英語の点数{32,34,41,38,40,26,14,46,42,50} と数学の点 2 2022/05/26 21:31
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# (C言語)めちゃくちゃな値になってしまいます。 5 2022/08/13 11:55
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DLLファイルの逆コンパイラにつ...
-
ソフトの開発言語を調べる方法
-
C++でデスクトップGUIアプリ開...
-
変数の内容がコロコロ変わる、...
-
unsigned long long 型のフォー...
-
PICでのI2C通信でのマスタ、ス...
-
リリースモードとデバッグモー...
-
for文内での変数定義
-
main() 関数は、int を返値とす...
-
C言語での四角形描写
-
パーサとコンパイラの違いって?
-
C言語のプログラミングのソフト...
-
24bit サイズの変数
-
cudaのnvccはmingwやgccでも使...
-
SH2マイコンで
-
VB6のコンパイラ
-
python エラー
-
エクセルのエラーメッセージ「4...
-
<unistd.h>をVisualStudioでつ...
-
Eclipseのブレークポイントが○...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ソフトの開発言語を調べる方法
-
unsigned long long 型のフォー...
-
C++でデスクトップGUIアプリ開...
-
COBOLの論理演算子について質問...
-
組み込みソフト。ROM領域にデータ
-
printfなど、標準関数のソース...
-
cc と gcc の違い
-
リリースモードとデバッグモー...
-
パーサとコンパイラの違いって?
-
AIXとCOBOLについて
-
<conio.h>?
-
COBOLのALPHABET...
-
VC++の/Zm オプションについて
-
C++Builder → Visual C++ 移植...
-
C言語の規格
-
COBOLの論理演算子について
-
変数の内容がコロコロ変わる、...
-
Macで使えるC言語のコンパイラ...
-
PICでのI2C通信でのマスタ、ス...
-
最初に使う変数のゼロクリアに...
おすすめ情報