• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:void main()って誰が最初?:ANSI-C)

void main()って誰が最初?:ANSI-C

このQ&Aのポイント
  • ANSI-C言語に関することで、資料ではint main(void)が正しいと書かれているにも関わらず、なぜvoid main(void)と書かれた書籍が存在するのか疑問です。
  • void main(void)という表記は間違いであり、正しいのはint main(void)です。しかし、いまだにvoid main(void)と書かれた書籍が存在する理由は不明です。
  • 誰が最初にvoid main(void)という表記を使い始めたのかはわかりませんが、影響力のある人物が関与していた可能性が考えられます。

質問者が選んだベストアンサー

  • ベストアンサー
noname#30871
noname#30871
回答No.1

 昔は『プログラミング言語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
noname#4091
質問者

お礼

回答ありがとうございました。 第一版を読んだことはあるんですがvoid main(void)だったことはぜんぜん覚えてません。 第一版を読む前にカーニハン&パイクの『UNIXプログラミング環境』を読んで「mainはintなんだ」と先入観があったからかな。 参考URL読みましたけど、このページの内容もヤバイくらい間違ってますね。

その他の回答 (3)

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.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)と書かれたサンプルが載っています。

  • ysk6406
  • ベストアンサー率40% (237/589)
回答No.3

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

noname#4091
質問者

補足

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

noname#30871
noname#30871
回答No.2

すみません、訂正。 > 言語設計者が自ら開発した  「言語設計者が自ら執筆した」 > 翻訳になっちます。  「翻訳になっています。」

関連するQ&A