アプリ版:「スタンプのみでお礼する」機能のリリースについて

 ここには規格に詳しい方が多いので、質問します。

 「main() 関数は、int を返すようにC言語の規格で定められている」と言うような記述を読んだ事が有ります。

 なるべくなら規格に従いたいけれど、返値の使い道が無い。使い道が無くても規格に従うなら、「return 0」と書くべきなのかと思っています。

 宜しくお願いします。

A 回答 (5件)

結論から言えば「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を返すのだと信じて疑わない盲信者」が生息しているので注意しましょう。
    • good
    • 0
この回答へのお礼

 回答有り難う御座います。
 調べてみると、色々な事が有るようですね。

 No.5のjacta さんの回答から読めることは、
 void main(void) は、C99の規格には合っているが、C90では規格外。

 「void main(void) と書いてある本は読むな!」と言うような過激な発言が間違いのようですね。

お礼日時:2009/12/12 10:51

> 調べると、ANSI C の仕様では次の4通りが有るとなっています。



はい。ただし、その仕様はC99の場合です。
C90の場合、mainの返却値型がintでない場合の動作は未定義になります。
なお、フリースタンディング環境の場合には、プログラム開始位置の型や関数名は処理系定義になります(つまり、mainでなく、startとかbootとかの名前もあり得ます)。
    • good
    • 1
この回答へのお礼

 いつも回答有り難う御座います。jactaさんは、規格を詳しくご存じですね。

 void main(void) は規格外の間違いなのかと思って質問したのですが、結構奥が深いですね。
 フリースタンディングとかC99などをウィキペディアで調べて、勉強になりました。
 
 また何か質問したら、宜しくお願いします。

お礼日時:2009/12/12 11:24

>返値の使い道が無い。


それは、あなたにとってたまたま使い道がないだけの話で、世の中には、それを必要とする場合があるということです。

というか、Cの規格が作られた当時は、プログラムは原則として値を返さなければならなかったのです。なので、規格もそのように決められました。

もし、当時から今のように、プログラムの返り値が不要な場合が多かったならば、規格ももう少し違ったものになっていたかもしれませんね。

でも、昔々のCって、voidがありませんでしたから。そっちの影響のほうが大きいかも。

いずれにせよ、規格に従うのは大事なことですので、return 0と書くべきなのは正しいと思います。
    • good
    • 0
この回答へのお礼

 早速の回答有り難う御座います。

 書き忘れましたが、マイコンのプログラムを作っています。そのため main() を呼ぶプログラムも自分で管理しています。
 このような場合にも返値を書かなければ規格違反なのかと思った訳です。

 No1,No2 のお礼に有るように、知りたい事が分かりました。

 No1 の方に言われて色々と調べたところ、return 0 は正常終了の意味に多く使われると言う事も分かりました。

お礼日時:2009/12/11 12:45

>返値の使い道が無い


Windowsを例として答えるとバッチファイルで値をチェックして処理を分岐する事ができます。つまり使い道があるワケです。
まぁ、最近の人はバッチファイルなんて使わないでしょうが・・・。
    • good
    • 0
この回答へのお礼

 早速の回答有り難う御座います。

 書き忘れましたが、マイコンのプログラムを作っています。
 void main(void) とするのはC言語の仕様違反なのか調べたくて質問しました。
 No.1 のお礼に有るように、組み込みだったら void main(void) としても違反では無さそうだと分かりました。

 よく此処で回答して下さる下記の jacta さんの書き込みを見ても、C言語の仕様違反では無いと判断しました。

-----------------------------
質問番号:2074883  回答No5

また、mainの返却値型はint型が基本ですが、特定の状況では他の型、例えばvoid型の場合もあり得ます。その状況というのは、

1. 組み込み用の処理系など、フリースタンディング環境である場合、処理系定義の型となり得る。
-----------------------------

 バッチファイルのコマンドを調べるため、MS-DOS時代の本は貴重ですね。大事に何冊か持っています。

お礼日時:2009/12/11 12:29

返答するのも馬鹿馬鹿しいが、「教えて!検索」で「main」をキーワードに「このカテゴリーから検索」すると、参照URLに記載した質問に行きあたる。

。。

参考URL:http://oshiete1.goo.ne.jp/qa2445252.html
    • good
    • 0
この回答へのお礼

 検索方法を教えて頂いて有り難う御座います。

 調べると、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言語の仕様に違反していないと判断しました。

お礼日時:2009/12/11 12:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!