なぜC+のmain関数はどのクラスにも属していないのか
1 :
デフォルトの名無しさん:
語る
2ゲット
またC系の新言語か。
もうアイちゃん
糞スレは立てちゃだめって言ったでしょ
答えは簡単。
C++は過去のシガラミを引きずっているから
5 :
デフォルトの名無しさん:2010/05/16(日) 15:43:55
逆になぜ属する必要があるんだ?
アプリケーションのエントリーポイントなんてグローバルに一つあれば十分じゃん。
C#やJavaはグローバルな関数を作れないから
仕方なく属しているだけ
C++はCとの互換性を無視してまで無理に属させる必要も無い
終了
>>6 仕方なくである必要ないだろ。
グローバル関数は害悪だ。
だからこそ属す必要がある。
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
Java厨がほざいてるならまだ分かるがなぜC++なんだ?
と思ったらC+とかいう俺の知らない言語だった
mainはグローバルに置く方が自然だよ
JavaやC#ではエントリポイントを持つためだけの意味のないクラスを作ったりする
文法上の制限でクラスに属さないといけないだけ
新言語C+のことは知らないけど
C++はプリプロセッサで実装されていた時代の都合による
>>10 だったらmain()を持ったクラスを作らずに
main()からをすぐ動かせる既存のクラスにmain()を追加すればいいじゃん
ぶっちゃけmain()のためだけにわざわざ専用のクラス作る必要ないよ
再利用可能なクラスにmainを実装して
再利用しにくくしちゃうんですね
>>13 main はstatic関数なので、ごみになるだけで再利用の邪魔にはならない。
複数あったらどれが動くんだよ?
>>15 Java, .NET を勉強してくれ。(やり方が異なる)
何言ってんだこの馬鹿
>>14 main method のあるクラスなんて継承したくないぞ
>>14 意図しないメソッドが呼び出し可能ってどうなのよ
>>20 わざわざ呼び出しているんだから意図しているだろ。
>>21 親クラスに main() なんてメソッドがあったらキモイわあ
え?
main 関数に関してはクラスに属していなくても不自然ではないと思うなあ。
クラスが何のためにあるかを考えたときに main 関数の役割はそれに当てはまらないわけだし。
mainを隠蔽することができるなら
属させる意味はあると思われ
VC#なんか昔はフォームアプリのMainはフォームクラスの中に作られてたけど
今は変更されてProgramっていう無意味なクラスの中に作られるようになってるね
Startupに使う Main methodは、publicである必要はない。
そもそもエントリーポイントなんて概念自体が恣意的なものだ。
オブジェクトの一部であってもただの関数であっても良いが、それは言語それぞれの都合による。
どちらが良いとしても大した違いではない、問題としては瑣末なものだ。
関数の形をしてるが、単にエントリーポイントを指定する書式みたいなもんだからな
下手にmain()のようなグローバル関数を量産されても困るんだがな
クラスのテスト用によくmain()を複数実装しているのがあるが
ああいうときにmain()がグローバル関数で実装されるとテストしづらくて迷惑
>クラスのテスト用によくmain()を複数実装しているのがあるが
それはない
せめてmain内で呼び分けてくれ
>>32 障害が起こったときに、オプション変えるだけでテストできるから便利だぞ。
>>32 main内でやると面倒くさいぞ
mainをクラスの中にいれておくとclassファイルかjarファイルを追加削除するだけで
切り替えができるからけっこう便利なんだぜ
35 :
デフォルトの名無しさん:2010/05/22(土) 21:13:38
クラスに属せる main がかけたら
クラスに属さない main
クラスAに属する main
クラスBに属する main
・
・
やっぱクラスに属さない main が特別に見えて
クラスに属さない main から起動するってのは美しくないかい?
スマン、久々のかきこで上げてしまった orz.
CコンパチなんだからC++がmain意外のエントリポイントを用意するのは不自然
Cコンパチでないクラスベースの言語がわざわざ野良mainを用意するのは不自然
そんだけの話だろ
クラスに属するなら実質的にはmainという名前に縛る意味が無いんだよな
縛らないとどれがエントリポイントなのか分からんじゃん
それともentrypointみたいなキーワードを用意しろと?
AppMain クラスみたいな出来合いのクラスがあっても良いっちゃ良いかもね
>>39 リンカでエントリ関数で指定できるから、指定すればいい
めんどくちゃい
ディスってんじゃねーぞメーン
Javaから他の言語に移ったら
普通の関数のないJavaの方が害悪に見えるがな
それに適応出来ない程度なら、何でも害悪なんじゃないの
適応ぐらいできるけど、気持ち悪いと感じる。
staticメソッドって、クラスに関係あるファクトリ関数とか定義する為にあるのであって、
文法上の都合でクラスとなんの関係もないstatic関数を定義せにゃならんのがキモい。
まー、気分の問題なんだが。
staticつけるかつけないかの違いだけだろ
どのクラスにも属していないC++の関数は無数にあるのに、なぜmainだけを気にするのか
mainを隠蔽できないからだろうな
暇だからです
孤独を愛しているから
別にmainだけじゃなく、WinMainとか、OwlMainとか、色々あるじゃん
実際にはスタートアップルーチンからmain()は呼ばれます。
main()からプログラムが走ってるわけじゃない。
ま、スタートアップルーチンの作り次第ってこと。
グローバルにある関数は副作用さえなければ害悪はないだろうね。
用途によってそれぞれのネームスペースに収められていたほうが良いとおもうけど。
エントリポイントが複数あったら
実行時に指定する必要があるからな。
Javaの場合全てのクラスに定義できる。
つかC++と違って予約語の類いじゃないし。
ただ有名なVMが指定されたmainメソッド
を勝手に読んでるだけ。
別にコンストラクタから始まるうVM自作しても構わん。
JLSで規定されてたりしないの?
仕様に従わないVMの自作はできるだろうけど
VMまで作らんでもシェルスクリプトと補助クラスで
任意のメソッド呼ぶ事もできるがな。
wrapingjava --entry Method user.SampleClass
なぜJavaのmain関数は特定のクラスに属しているのか
>>63 慣習と言ってしまうなら、それは、C/C++も同じ。
C/C++は言語仕様でmain関数から始まると規定されてるだろ。
単なる慣習ではない
つーかJavaではJLSに規定ないの?
メソッドを呼び出した時の戻り値がちゃんと仕様を満たしているか把握すんのは動的型付けじゃ難しい
誤爆した。すまん。
68 :
デフォルトの名無しさん:2011/11/20(日) 11:29:34.29
いえいえ
69 :
デフォルトの名無しさん:2011/12/09(金) 00:21:39.23
たぶんおちんちん出してセックスしないと子供が生まれないからだよね
普段は隠蔽してるけど
mainはアプリ起動情報を持つmain threadクラスのメソッド
71 :
デフォルトの名無しさん:2011/12/19(月) 02:07:02.20
いつもぶらぶらしてますが
c++のmainがクラスに属さない理由
c++はクラスを使わなくても書けるようになってるから。もっと言うとc++のコンパイラはc互換のソースをコンパイルできなくてはならないから。
javaのmainがクラスに属しなければならない理由
javaがクラスに属しない要素を認めてないから。もっと言うとjavaの実行形式はclassファイルの集合なので、mainがクラスに属さないのならmainを格納するためのモジュールをclassファイルとは別に生成しなければならなくなる。
C++に限らずJava以前の言語はクラスの中にmainなんて持ってないだろ。
ちなみに、C++でもマクロを駆使して、コンパイル時にg++ -DMainClass
みたいにmainとなるクラスを指定することは出来る。
ただ、冗長なだけで意味がない。
そういうマジな回答ではなく、ユーモアに溢れる回答はないのか。
なんでお前いつも一人ぼっちなの? とか言われたらお前ら死にたくなるだろ
main は想像のネ申だからさ
constructor
じゃなくて
The Creator
な
`main function' を日本語に直訳すると主機能
主になるものが1つのプログラムに複数あったら気持ち悪いじゃないか
>>1ごめん簡単な質問。
答えはC++だから。
D言語は既にあるけど、そういう言語があればクラスに属していたのかもね。
>>80 不正解。C++の規格上フリースタンディングなら、
関数である限り、何をエントリーポイントにしても構わない。
CとC++との中間ぐらいの言語化
C+-+
cfrontナツカシス
本質的には元になったC言語のmain()も同じことなんだよね。
だって、そもそも処理が関数に属していなければならない理由なんて本来は無い。
C言語でmain()などのエントリポイントが必要な理由は
「C言語の仕様において、処理は何らかの関数に属していなければならないから」
でしかない。Javaはそれをさらに「メソッドは何らかのクラスに属していなければならない」ともう一段階増やしただけ。
そもそも処理を関数外( Procedureも含む )に書ける言語ってInterpreter系ぐらいじゃね。
Compile系だと、mainとなるSource FIleの指定なんてできないから、どうしても
Entry Pointとして名前のついたBlockが必要になる。
はぁ?
言いたいことがよく判らんよ。
まずは、「処理を関数外に書ける」って辺りからちんぷんかんぷんだ。
perlや、jrunsriptだとEntry Pointにあたる関数書かなくても
print( "message" );
と書くだけで実行できるね。