なぜC+のmain関数はどのクラスにも属していないのか

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
語る
2デフォルトの名無しさん:2010/05/16(日) 14:15:45
2ゲット
またC系の新言語か。
3デフォルトの名無しさん:2010/05/16(日) 14:18:21
もうアイちゃん
糞スレは立てちゃだめって言ったでしょ
4デフォルトの名無しさん:2010/05/16(日) 14:21:27
答えは簡単。

C++は過去のシガラミを引きずっているから
5デフォルトの名無しさん:2010/05/16(日) 15:43:55
逆になぜ属する必要があるんだ?
アプリケーションのエントリーポイントなんてグローバルに一つあれば十分じゃん。
6デフォルトの名無しさん:2010/05/16(日) 18:05:22
C#やJavaはグローバルな関数を作れないから
仕方なく属しているだけ
C++はCとの互換性を無視してまで無理に属させる必要も無い


終了
7デフォルトの名無しさん:2010/05/16(日) 19:56:23
>>6
仕方なくである必要ないだろ。
グローバル関数は害悪だ。
だからこそ属す必要がある。
8デフォルトの名無しさん:2010/05/16(日) 20:18:09
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。

アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。

                  京都大学霊長類研究所
9デフォルトの名無しさん:2010/05/16(日) 20:54:15
Java厨がほざいてるならまだ分かるがなぜC++なんだ?
と思ったらC+とかいう俺の知らない言語だった
10デフォルトの名無しさん:2010/05/16(日) 21:33:55
mainはグローバルに置く方が自然だよ
JavaやC#ではエントリポイントを持つためだけの意味のないクラスを作ったりする
文法上の制限でクラスに属さないといけないだけ
11デフォルトの名無しさん:2010/05/16(日) 23:13:41
新言語C+のことは知らないけど
C++はプリプロセッサで実装されていた時代の都合による
12デフォルトの名無しさん:2010/05/16(日) 23:53:55
>>10
だったらmain()を持ったクラスを作らずに
main()からをすぐ動かせる既存のクラスにmain()を追加すればいいじゃん
ぶっちゃけmain()のためだけにわざわざ専用のクラス作る必要ないよ
13デフォルトの名無しさん:2010/05/17(月) 00:18:09
再利用可能なクラスにmainを実装して
再利用しにくくしちゃうんですね
14デフォルトの名無しさん:2010/05/17(月) 00:20:39
>>13
main はstatic関数なので、ごみになるだけで再利用の邪魔にはならない。
15デフォルトの名無しさん:2010/05/17(月) 00:27:26
複数あったらどれが動くんだよ?
16デフォルトの名無しさん:2010/05/17(月) 00:31:00
>>15
Java, .NET を勉強してくれ。(やり方が異なる)
17デフォルトの名無しさん:2010/05/17(月) 00:33:03
何言ってんだこの馬鹿
18デフォルトの名無しさん:2010/05/17(月) 00:41:23
>>14
main method のあるクラスなんて継承したくないぞ
19デフォルトの名無しさん:2010/05/17(月) 01:04:42
>>7
Effective C++ を読んでこい
20デフォルトの名無しさん:2010/05/17(月) 01:32:20
>>14
意図しないメソッドが呼び出し可能ってどうなのよ
21デフォルトの名無しさん:2010/05/17(月) 03:25:33
>>20
わざわざ呼び出しているんだから意図しているだろ。
22デフォルトの名無しさん:2010/05/17(月) 03:43:13
>>21
親クラスに main() なんてメソッドがあったらキモイわあ
23デフォルトの名無しさん:2010/05/17(月) 07:49:40
>>22
気分で言われてもな。
24デフォルトの名無しさん:2010/05/17(月) 13:49:39
え?
25デフォルトの名無しさん:2010/05/17(月) 17:12:05
main 関数に関してはクラスに属していなくても不自然ではないと思うなあ。
クラスが何のためにあるかを考えたときに main 関数の役割はそれに当てはまらないわけだし。
26デフォルトの名無しさん:2010/05/17(月) 19:00:34
mainを隠蔽することができるなら
属させる意味はあると思われ
27デフォルトの名無しさん:2010/05/17(月) 22:59:05
VC#なんか昔はフォームアプリのMainはフォームクラスの中に作られてたけど
今は変更されてProgramっていう無意味なクラスの中に作られるようになってるね
28デフォルトの名無しさん:2010/05/17(月) 23:06:57
Startupに使う Main methodは、publicである必要はない。
29デフォルトの名無しさん:2010/05/18(火) 16:51:35
そもそもエントリーポイントなんて概念自体が恣意的なものだ。
オブジェクトの一部であってもただの関数であっても良いが、それは言語それぞれの都合による。
どちらが良いとしても大した違いではない、問題としては瑣末なものだ。
30デフォルトの名無しさん:2010/05/19(水) 06:57:17
関数の形をしてるが、単にエントリーポイントを指定する書式みたいなもんだからな
31デフォルトの名無しさん:2010/05/19(水) 18:15:28
下手にmain()のようなグローバル関数を量産されても困るんだがな

クラスのテスト用によくmain()を複数実装しているのがあるが
ああいうときにmain()がグローバル関数で実装されるとテストしづらくて迷惑
32デフォルトの名無しさん:2010/05/19(水) 21:05:26
>クラスのテスト用によくmain()を複数実装しているのがあるが
それはない
せめてmain内で呼び分けてくれ
33デフォルトの名無しさん:2010/05/19(水) 21:19:51
>>32
障害が起こったときに、オプション変えるだけでテストできるから便利だぞ。
34デフォルトの名無しさん:2010/05/20(木) 00:35:30
>>32
main内でやると面倒くさいぞ
mainをクラスの中にいれておくとclassファイルかjarファイルを追加削除するだけで
切り替えができるからけっこう便利なんだぜ
35デフォルトの名無しさん:2010/05/22(土) 21:13:38
クラスに属せる main がかけたら

クラスに属さない main
クラスAに属する main
クラスBに属する main



やっぱクラスに属さない main が特別に見えて
クラスに属さない main から起動するってのは美しくないかい?
36デフォルトの名無しさん:2010/05/22(土) 21:14:23
スマン、久々のかきこで上げてしまった orz.
37デフォルトの名無しさん:2010/05/22(土) 21:16:55
CコンパチなんだからC++がmain意外のエントリポイントを用意するのは不自然
Cコンパチでないクラスベースの言語がわざわざ野良mainを用意するのは不自然

そんだけの話だろ
38デフォルトの名無しさん:2010/05/22(土) 21:22:23
クラスに属するなら実質的にはmainという名前に縛る意味が無いんだよな
39デフォルトの名無しさん:2010/05/23(日) 03:31:35
縛らないとどれがエントリポイントなのか分からんじゃん
それともentrypointみたいなキーワードを用意しろと?
40デフォルトの名無しさん:2010/05/23(日) 03:33:38
AppMain クラスみたいな出来合いのクラスがあっても良いっちゃ良いかもね
41デフォルトの名無しさん:2010/05/23(日) 10:31:56
>>39
リンカでエントリ関数で指定できるから、指定すればいい
42デフォルトの名無しさん:2010/05/23(日) 10:33:17
めんどくちゃい
43デフォルトの名無しさん:2010/05/23(日) 14:01:21
>>38
う、うん……(´・ω・`)
44デフォルトの名無しさん:2010/05/23(日) 16:13:45
ディスってんじゃねーぞメーン
45デフォルトの名無しさん:2010/05/31(月) 06:38:10
Javaから他の言語に移ったら
普通の関数のないJavaの方が害悪に見えるがな
46デフォルトの名無しさん:2010/05/31(月) 06:44:11
それに適応出来ない程度なら、何でも害悪なんじゃないの
47デフォルトの名無しさん:2010/05/31(月) 17:49:02
適応ぐらいできるけど、気持ち悪いと感じる。
staticメソッドって、クラスに関係あるファクトリ関数とか定義する為にあるのであって、
文法上の都合でクラスとなんの関係もないstatic関数を定義せにゃならんのがキモい。
まー、気分の問題なんだが。
48デフォルトの名無しさん:2010/06/01(火) 13:37:51
staticつけるかつけないかの違いだけだろ
49デフォルトの名無しさん:2010/06/01(火) 21:54:40
どのクラスにも属していないC++の関数は無数にあるのに、なぜmainだけを気にするのか
50デフォルトの名無しさん:2010/06/01(火) 22:25:59
mainを隠蔽できないからだろうな
51デフォルトの名無しさん:2010/06/26(土) 09:15:55
暇だからです
52デフォルトの名無しさん:2010/06/26(土) 22:32:08
孤独を愛しているから
53デフォルトの名無しさん:2010/06/26(土) 22:39:07
>>50
クラスごと隠蔽したらいいのに。
54デフォルトの名無しさん:2010/06/28(月) 21:38:28
別にmainだけじゃなく、WinMainとか、OwlMainとか、色々あるじゃん
55デフォルトの名無しさん:2010/07/26(月) 18:50:51
実際にはスタートアップルーチンからmain()は呼ばれます。
main()からプログラムが走ってるわけじゃない。
ま、スタートアップルーチンの作り次第ってこと。
56デフォルトの名無しさん:2010/10/12(火) 14:15:06
グローバルにある関数は副作用さえなければ害悪はないだろうね。
用途によってそれぞれのネームスペースに収められていたほうが良いとおもうけど。
57デフォルトの名無しさん:2010/10/16(土) 22:06:24
エントリポイントが複数あったら
実行時に指定する必要があるからな。
58デフォルトの名無しさん:2010/10/17(日) 06:20:00
>>57
アレはアレで便利だが
59デフォルトの名無しさん:2011/06/01(水) 17:16:33.88
Javaの場合全てのクラスに定義できる。
つかC++と違って予約語の類いじゃないし。
ただ有名なVMが指定されたmainメソッド
を勝手に読んでるだけ。
別にコンストラクタから始まるうVM自作しても構わん。
60デフォルトの名無しさん:2011/06/01(水) 20:11:03.87
JLSで規定されてたりしないの?
仕様に従わないVMの自作はできるだろうけど
61デフォルトの名無しさん:2011/06/01(水) 22:18:53.98
VMまで作らんでもシェルスクリプトと補助クラスで
任意のメソッド呼ぶ事もできるがな。

wrapingjava --entry Method user.SampleClass
62デフォルトの名無しさん:2011/09/15(木) 18:52:47.82
なぜJavaのmain関数は特定のクラスに属しているのか
63デフォルトの名無しさん:2011/09/18(日) 17:21:50.60
Java VMに登録されてるデフォルトのClassLoaderが、慣習的にmainというメソッドを読んでるだけで、
mainは予約語でもなんでもないから。もっといえば、Javaのクラスファイル上にエントリーポイントは無いから。

http://java.sun.com/docs/books/jvms/second_edition/html/VMSpecTOC.doc.html
仕様上VMどのメソッドを呼ぼうが、インスタンスメソッドを呼ぼうがClassLoader次第。
あるいみ本当のエントリーポイントはClassLoaderになる。
64デフォルトの名無しさん:2011/09/21(水) 17:05:22.65
>>63
慣習と言ってしまうなら、それは、C/C++も同じ。
65デフォルトの名無しさん:2011/09/21(水) 17:22:06.95
C/C++は言語仕様でmain関数から始まると規定されてるだろ。
単なる慣習ではない

つーかJavaではJLSに規定ないの?
66デフォルトの名無しさん:2011/09/25(日) 15:44:46.82
メソッドを呼び出した時の戻り値がちゃんと仕様を満たしているか把握すんのは動的型付けじゃ難しい
67デフォルトの名無しさん:2011/09/25(日) 15:45:13.77
誤爆した。すまん。
68デフォルトの名無しさん:2011/11/20(日) 11:29:34.29
いえいえ
69デフォルトの名無しさん:2011/12/09(金) 00:21:39.23
たぶんおちんちん出してセックスしないと子供が生まれないからだよね
普段は隠蔽してるけど
70ビル・ジョブス:2011/12/10(土) 08:55:25.07
mainはアプリ起動情報を持つmain threadクラスのメソッド
71デフォルトの名無しさん:2011/12/19(月) 02:07:02.20
72デフォルトの名無しさん:2011/12/19(月) 05:41:15.10
いつもぶらぶらしてますが
73デフォルトの名無しさん:2011/12/21(水) 05:23:28.85
c++のmainがクラスに属さない理由
c++はクラスを使わなくても書けるようになってるから。もっと言うとc++のコンパイラはc互換のソースをコンパイルできなくてはならないから。

javaのmainがクラスに属しなければならない理由
javaがクラスに属しない要素を認めてないから。もっと言うとjavaの実行形式はclassファイルの集合なので、mainがクラスに属さないのならmainを格納するためのモジュールをclassファイルとは別に生成しなければならなくなる。
74デフォルトの名無しさん:2011/12/21(水) 23:49:34.71
C++に限らずJava以前の言語はクラスの中にmainなんて持ってないだろ。
ちなみに、C++でもマクロを駆使して、コンパイル時にg++ -DMainClass
みたいにmainとなるクラスを指定することは出来る。
ただ、冗長なだけで意味がない。
75デフォルトの名無しさん:2011/12/23(金) 22:50:36.40
そういうマジな回答ではなく、ユーモアに溢れる回答はないのか。
76デフォルトの名無しさん:2011/12/24(土) 09:50:56.96
なんでお前いつも一人ぼっちなの? とか言われたらお前ら死にたくなるだろ
77デフォルトの名無しさん:2011/12/24(土) 12:15:34.36
main は想像のネ申だからさ
78デフォルトの名無しさん:2011/12/24(土) 12:17:18.00
constructor
じゃなくて
The Creator
79デフォルトの名無しさん:2012/01/13(金) 18:55:14.05
`main function' を日本語に直訳すると主機能
主になるものが1つのプログラムに複数あったら気持ち悪いじゃないか
80デフォルトの名無しさん:2012/02/05(日) 00:18:18.44
>>1ごめん簡単な質問。
答えはC++だから。
D言語は既にあるけど、そういう言語があればクラスに属していたのかもね。
81デフォルトの名無しさん:2012/02/23(木) 01:03:41.15
>>80
不正解。C++の規格上フリースタンディングなら、
関数である限り、何をエントリーポイントにしても構わない。
82デフォルトの名無しさん:2012/03/09(金) 00:29:50.66
CとC++との中間ぐらいの言語化
83デフォルトの名無しさん:2012/03/09(金) 00:55:07.02
C+-+
84デフォルトの名無しさん:2012/03/09(金) 17:42:57.95
>>82
初期のC++その物。
85デフォルトの名無しさん:2012/03/25(日) 14:05:22.39
cfrontナツカシス
86デフォルトの名無しさん:2012/05/31(木) 01:17:57.48
本質的には元になったC言語のmain()も同じことなんだよね。
だって、そもそも処理が関数に属していなければならない理由なんて本来は無い。
C言語でmain()などのエントリポイントが必要な理由は
「C言語の仕様において、処理は何らかの関数に属していなければならないから」
でしかない。Javaはそれをさらに「メソッドは何らかのクラスに属していなければならない」ともう一段階増やしただけ。
87デフォルトの名無しさん:2012/06/20(水) 20:47:06.27
そもそも処理を関数外( Procedureも含む )に書ける言語ってInterpreter系ぐらいじゃね。
Compile系だと、mainとなるSource FIleの指定なんてできないから、どうしても
Entry Pointとして名前のついたBlockが必要になる。
88デフォルトの名無しさん:2012/06/20(水) 23:41:33.87
はぁ?
言いたいことがよく判らんよ。
まずは、「処理を関数外に書ける」って辺りからちんぷんかんぷんだ。
89デフォルトの名無しさん
perlや、jrunsriptだとEntry Pointにあたる関数書かなくても

print( "message" );

と書くだけで実行できるね。