トップページ⇒tech
89コメント19KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/05/16(日) 14:13:03
語る
0002デフォルトの名無しさん2010/05/16(日) 14:15:45
2ゲット
またC系の新言語か。
0003デフォルトの名無しさん2010/05/16(日) 14:18:21
もうアイちゃん
糞スレは立てちゃだめって言ったでしょ
0004デフォルトの名無しさん2010/05/16(日) 14:21:27
答えは簡単。

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


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

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

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

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

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

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

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

wrapingjava --entry Method user.SampleClass
0062デフォルトの名無しさん2011/09/15(木) 18:52:47.82
なぜJavaのmain関数は特定のクラスに属しているのか
0063デフォルトの名無しさん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になる。
0064デフォルトの名無しさん2011/09/21(水) 17:05:22.65
>>63
慣習と言ってしまうなら、それは、C/C++も同じ。
0065デフォルトの名無しさん2011/09/21(水) 17:22:06.95
C/C++は言語仕様でmain関数から始まると規定されてるだろ。
単なる慣習ではない

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

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

print( "message" );

と書くだけで実行できるね。
■ このスレッドは過去ログ倉庫に格納されています