最新閲覧日:

ANSI-C言語に関することです。
ベンダー拡張やOS固有機能は除外してください。

よく、書籍でvoid main(void)と書いたサンプルを見かけます。
プログラミング言語Cではint main(void)だし、C言語FAQでも「void main(void)は間違いである」と書いてあるのに…。
過去の質問への回答で「ANSI-Cでは…」と解説している人がいたのでANSI-Cの仕様を調べてもint main(void)の方が正しいように書かれていました。

これだけ資料が揃っているのにいまだにvoid main(void)と書かれた書籍がイッパイあるのはなぜなんでしょう?
最初にvoid main(void)って書いた人がものすごく影響力のある人だったのか?と想像してしまいます。
いったい誰が最初にvoid main(void)と書き始めたのでしょうか?

A 回答 (4件)

実際に「プログラミングする人」に関してではなく、「参考書/教則本の著者」に関する話題ですよね。



実際のプログラミングの現場では“OS固有の機能”または“コンパイラのベンダー拡張”によってvoid型のmainが許容されることが多いと思います。
その点はchaosheroさんもご存知だから「ANSI-C言語に関することです。 ベンダー拡張やOS固有機能は除外してください。 」と断っておられるのでしょう。

歴史的に見た場合amajunさんのおっしゃることが答えになると思います。
と言っても私も第一版は捨ててしまっているので確認したわけではありません(しかもうろ覚え)。

> これだけ資料が揃っているのにいまだにvoid main(void)と書かれた書籍がイッパイあるのはなぜなんでしょう?
この部分は単純です。
著者が良く理解できていないからです。
hosted environmentとfree standing environmentの違うすら理解できていないのでしょう。
本来、この手の人たちは教則本を書くべきではないのですが「言葉がやさしい」、「図や絵が多い」といった(本質的でない)理由によって受け入れられてしまっているため発行部数が伸びてしまい、「『発行部数の多い本は良い本だろう』という誤解を生んでまた売れる」という悪循環が生まれてしまうのでしょう。
また、本来チェック機間である筈の出版社がチェックしきれていないのも問題です。
より大きな問題として「コンピュータ教育している人たちが理解できていないので教科書にその手の本を採用する」ということもあります。

私は専門学校でC/C++を教えているのですが、担当が2年生であること&非常勤であることで1年生の教科書選定に加わることが出来ません。
結果として、毎年最初の授業で「1年生の教科書は捨てろ!1年生の授業と2年生の授業の内容が違ったら俺が正しい!」という洗脳からはじめるハメになっています。
2年生の最初の1ヶ月でCの文法を全て教えなおすという異常な状況です。

教科書/教則本は「実際的なもの」と「原則的なもの」があるべきです。
その意味で『ANSI-C準拠』と書かれたものにvoid main(void)とあれば、その本は駆逐されるべきでしょう。
実際的な本(特定のコンパイラの解説書など)では許されると思います。

完全に余談ですが…
今年の1年生の教科書は『ANSI-C準拠』と書かれていますがターゲットコンパイラがLSI-C86(ANSI-Cに完全準拠してないって!)でvoid main(void)と書かれたサンプルが載っています。
    • good
    • 0

歴史的なことには詳しくないのですが、main 関数の使い方として


void main の方が自然だからではないでしょうか?

つまり、宣言は void main、終了する時は return ではなく exit 関数を
使い、その引数が呼び出し元に戻される、というスタイルですね。
多くの処理系では main で return n; とすれば exit(n); と同じ動作を
しますが、私は、この書き方はほとんど見かけたことはありません。

この回答への補足

mainの型の問題とexitで値が返せることは別問題ですね。
C言語FAQでも「OSが値を受け取るかどうか、exitで値を返せるかどうかとmainがintであることは関係ない」と書かれています。

また、実際のプログラミングでvoid main(void)と書くのと書籍にvoid main(void)と書くのでは影響力に違いがあると思います。
実際のプログラミングでは「OS機能やベンダ拡張を利用するのは(場合によっては)当たり前」でしょう。
書籍(toysmithさんが言う原則的な本)でvoid main(void)と書くのは「ANSI-C規約に違反した書き方を紹介する」ことであり、ウソを書いていると言われても仕方ないと思います。

補足日時:2001/07/13 12:35
    • good
    • 0

すみません、訂正。



> 言語設計者が自ら開発した

 「言語設計者が自ら執筆した」

> 翻訳になっちます。

 「翻訳になっています。」
    • good
    • 0

 昔は『プログラミング言語C』が void main(void) と書いていたからです。



 この本はC言語を開発したDr.KernighanとDr.Ritchieが1978年に発表したものです。
 言語設計者が自ら開発した本として大きな影響力を持ち、「K&R本」と呼ばれて親しまれてきました。

 しかしK&R本の内容では、言語設計として曖昧な部分、不適切な部分もありました。そこで言語設計を洗いなおしたのが1988年のANSI規格です。

 同じころにK&R本もANSI規格に合致するように内容を改定して、『プログラミング言語C 第2版』として再発表されました。

 共立出版から出ている和訳本も、初めは第1版の翻訳でしたが、ANSI以降は第2版の翻訳になっちます。

 しかし我々は、日本語でもそうですが言語習慣というものはなかなか変えられません。だから今でも(コンパイラが許すなら)void main(void)と書く人もいるわけです。

参考URL:http://www.bohyoh.com/CandCPP/C/history.html
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
第一版を読んだことはあるんですがvoid main(void)だったことはぜんぜん覚えてません。
第一版を読む前にカーニハン&パイクの『UNIXプログラミング環境』を読んで「mainはintなんだ」と先入観があったからかな。

参考URL読みましたけど、このページの内容もヤバイくらい間違ってますね。

お礼日時:2001/07/12 16:03

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

このQ&Aを見た人が検索しているワード


人気Q&Aランキング

おすすめ情報

カテゴリ