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

No.3
- 回答日時:
歴史的なことには詳しくないのですが、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規約に違反した書き方を紹介する」ことであり、ウソを書いていると言われても仕方ないと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- 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
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# プログラミング実行後の表示される値を答えよ #include<stdio.h> void main( 7 2022/05/20 00:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
静的でないメンバ関数の呼び出...
-
C++にてtemplateで受け取った任...
-
const_castのつかいどころを教...
-
Notepad++の関数リスト表示の変...
-
既定のコンストラクタがありま...
-
別ソースファイル、同クラス名...
-
【gcc・cygwin】multiple defin...
-
(void)0 はどんな意味ですか
-
コールバックって・・・
-
C言語 extern について
-
static変数の配列の初期値を空...
-
戻り値を返す関数の前に(void)...
-
void main()って誰が最初?:AN...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
static constメンバ変数(配列)...
-
多重定義が起きている?--lnk20...
-
二重定義の回避法
-
LNK2019:未解決の外部シンボル ...
-
解凍ソフト(C++builderで作成...
-
int main()、void main()、void...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
多重定義が起きている?--lnk20...
-
const_castのつかいどころを教...
-
C++にてtemplateで受け取った任...
-
既定のコンストラクタがありま...
-
戻り値を返す関数の前に(void)...
-
静的でないメンバ関数の呼び出...
-
int main()、void main()、void...
-
C# KeyDownイベントでショート...
-
C# Controls.Addで動的に配置し...
-
(void)0 はどんな意味ですか
-
gcc: incompatible pointer type
-
_beginthreadにて発生するコン...
-
C#でラジオボタンを設定に記録...
-
C#でテンキーの操作は可能でし...
-
C++別のオブジェクトからメンバ...
-
CTabCtrl:TABインデックス単位...
-
見た目は同じソースなのにエラ...
-
pictureboxの画像を削除するには?
-
【VC++6.0】イベントハンドラ関...
おすすめ情報