【結構迷う】C vs. C++【どっちで行こうか】
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
2008/04/06(日) 03:17:49どちら一方をどっぷりと使っている人にとっては、かなり大きな
壁を感じると思います。
そこで、「C/C++」な人でも「C派」「C++派」に分かれて、それぞれの
観点からどちらの言語がより良いか、議論してみましょう。
主観的、客観的意見なんでも構いません。ただし建設的な議論に
なるよう、理由も添えてお願いします。
ルール
1.Java、C#などの「C/C++」以外は論外。これらについて言及している
レスは無視してください。
2.速い、遅いなどの議論は極力説得力のある根拠、ソース(情報源)
などを提示してください。
3.特定のOS、開発環境を理由に挙げたり、叩いたりしないでください。
たとえば、「Linuxの人は…」や「VC++ってやつは…」などは禁止。
4.標準、準標準のライブラリに関しては、その言語を使う場合常に
ついてまわるので言及をOKとします。
5.どちらか一方しか使ったことのない人は、その旨を述べた上で
意見をお願いします。
6.その他、明らかな煽りや無意味な書き込みも無視でお願いします。
00021
2008/04/06(日) 03:18:23C++はなぜ人気がないのか
ttp://itpro.nikkeibp.co.jp/free/ITPro/OPINION/20050215/156201/
もう C++ なんて好きでもないし使いもしない理由。
ttp://www.hyuki.com/yukiwiki/wiki.cgi?WhyINoLongerLikeOrUseCPlusPlus
Why not using C++?
ttp://xinehq.de/index.php/hackersguide#AEN405
Boost
http://www.boost.org/
GLib
http://library.gnome.org/devel/glib/2.8/
0003デフォルトの名無しさん
2008/04/06(日) 03:30:111つの意味の処理まとめて{ }ブロックで括って内部で変数寿命完結させるところとか美しい。
それとC++はMFCとか面白いじゃあないか 表向きの効率は旧VBや.netに劣るけれども。
0004デフォルトの名無しさん
2008/04/06(日) 03:32:170005C++
2008/04/06(日) 04:12:38newは嫌いだけどな
0006デフォルトの名無しさん
2008/04/06(日) 07:42:48string の楽チンさを知ってしまうと、もう C には戻れない。
template の汎用性を知ってしまうと、もう C には戻れない。
抽象プログラミングの威力を知ってしまうと、もう C には戻れない。
C はプログラマを低レベルなバグで悩まさせ、疲れさせる言語だ。
環境的な制約がない限り、迷う必要などない。
00071
2008/04/06(日) 10:38:57設計と進化を読んでからC++が大好きになってしまった。
「ポインタがあるのになぜ参照が導入されたか」などの理由を知ると
それがあまりにも必然に思えて、「C++は複雑化しすぎ」とか言われるほど
複雑に見えなくなってきた。C++の各機能の導入経緯を知ってから
自分の思考回路がC++と馴染んだ気がする。
C派の意見としてよく聞くのが、ABI不在による保守の問題とか、
その辺は自分はあまり実感ないです。
それから上記の理由により「複雑すぎて云々」も今や感じません。
あと、Boostにアドビから画像処理ライブラリが追加されるなど、Boostの勢いにも
魅力を感じます。
0008デフォルトの名無しさん
2008/04/06(日) 10:40:58なんで?
0009デフォルトの名無しさん
2008/04/06(日) 10:47:39せめて、同一プラットフォーム上だけでも統一してほしい。
00101
2008/04/06(日) 13:14:10ビョーンさんは言語内臓型とユーザ定義型を差別したくなかった
↓
例えば、複素数型でも c = a + b; と書けるようにしたかった
↓
演算子オーバーロード(operator+など)を導入
↓
一般的にユーザ定義型はポインタ渡しの方が効率的
↓
complex *operator+( const comple *a, const complex *b) {...} とすると…
↓
c = &a + &b; と書かなくてはならない
↓
誰もそんなの書きたがらないので、参照を導入(元々&a + &bには別の意味があるとも言っていた)
ちなみに記述方法の問題が出たとたん、すぐに参照を思いついた訳では
ないそうです。友人に相談したとき、その人がポロっと発した
「リファレンス」と言う言葉で閃いたそうです。
0011デフォルトの名無しさん
2008/04/06(日) 13:15:16演算子多重定義のため。
値渡しじゃ効率悪いし&x + &yとか見れたもんじゃない。
それに&x + 1とか多重定義できないし。
0012デフォルトの名無しさん
2008/04/06(日) 13:17:370013デフォルトの名無しさん
2008/04/06(日) 13:56:07脅迫観念に駆られる必要がないので、その辺はうらやましく
思うときがある。
加算関数なんてほとんど
void add(vector *dest, const vector *x, const vector *y)
の1パターンだからな。
方法論がシンプルな分、どうやろうか悩むことがほとんどないし。
0014デフォルトの名無しさん
2008/04/06(日) 14:07:150015デフォルトの名無しさん
2008/04/06(日) 19:17:26「ポインタポインタ」という美しくない方法を取ってたのが
「ポインタの参照」でしっくりきた。から参照はなかなか良いと思う
でも内部的にホントは「参照変数」なんて実体はなくて
便宜上そう見せてるだけなんでしょうね、きっと。
0016デフォルトの名無しさん
2008/04/06(日) 20:05:11C++はADLをはじめとする名前空間とオーバーロードの関係がわからなすぎる
0017デフォルトの名無しさん
2008/04/06(日) 23:08:580018デフォルトの名無しさん
2008/04/07(月) 00:13:400019デフォルトの名無しさん
2008/04/07(月) 00:15:36プッ(´,_ゝ`)
0020デフォルトの名無しさん
2008/04/07(月) 00:31:140021デフォルトの名無しさん
2008/04/07(月) 00:48:22OS Xの座標系がfloatなんだがどうすれば良いかな。
0022デフォルトの名無しさん
2008/04/07(月) 00:57:40それはデバイスドライバの仕事じゃね?
0023デフォルトの名無しさん
2008/04/07(月) 01:03:23ドライバの低水準なインタフェースの差を埋めるような部分はOSの仕事としてあるのでは?
0024デフォルトの名無しさん
2008/04/07(月) 01:05:390025デフォルトの名無しさん
2008/04/07(月) 09:44:55ライブラリとアプリでコンパイラが違うとマングリング規則が違って使えないだとか、
下手するとコンパイルオプション違うだけで、動かなかったりだとか。
(2番目はCでもありそうだけど)
0026デフォルトの名無しさん
2008/04/07(月) 12:32:08stringとかvectorとか便利だとは思うけど、「C++使いの常識」を踏まえて
コードを書かないと、効率が落ちたりするのが気に入らない。
EffectiveC++やEffectiveSTLを読んで初めてC++を使えてるって感じがやだなぁ。他にもいろいろ本読んだけど、
プログラムでやりたい事がなかなか進まずめちゃくちゃフラストレーションがたまった。
STLを勉強したいのか、プログラムを完成させたいのか、自分でも分からなくなるときがあった。
テンプレート使ったときよりコードは美しくないけど、Cの方が変なところに気をつかわず
コードが書けて、作りたいものがはかどる。
0027デフォルトの名無しさん
2008/04/07(月) 12:36:19客先納品物の場合は何かと面倒なのでCで書くこともままあるけど。
設計から自分で仕切れる場合は問答無用でC++だな。
0028デフォルトの名無しさん
2008/04/07(月) 13:27:08>かつてはC++でバリバリやってたけど
信憑性に難あり。
つか、C++が使える環境でC++を使わない理由などないんだが。
00291
2008/04/07(月) 13:42:13>つか、C++が使える環境でC++を使わない理由などないんだが。
>>25の意見に対してはどう思いますか?
ttp://www.hyuki.com/yukiwiki/wiki.cgi?WhyINoLongerLikeOrUseCPlusPlus
の記事にも似たような意見がありますが、具体的に何か反対意見があれば
お願いします。
0031デフォルトの名無しさん
2008/04/07(月) 19:55:37再利用しようとしてvoid*使うけど、型安全じゃなくなるよ
0032デフォルトの名無しさん
2008/04/07(月) 20:21:32書くのは(ry
0033デフォルトの名無しさん
2008/04/07(月) 23:32:33標準のstringを内包して、必要な機能を付けるだけでいいんでない?
0034デフォルトの名無しさん
2008/04/08(火) 00:58:18関数ハイジャック軽減法
http://www.kmonos.net/alang/d/2.0/hijack.html
テンプレート再訪
http://www.kmonos.net/alang/d/2.0/templates-revisited.html
配列
http://www.kmonos.net/alang/d/2.0/arrays.html
0035デフォルトの名無しさん
2008/04/08(火) 01:02:29なんだかんだでCもC++もだめな気がする今日この頃
0036デフォルトの名無しさん
2008/04/08(火) 01:23:35・ここで言われるC++の利点は他の高級言語なら、より良く実装されてる。
逆に言うと、それらの言語から見て、C++の実装は非常に中途半端に見える。
・Cは(一部の例外を除いて)非常にシンプルで明快なシンタックスである。利便性を
元に実装されたC++の拡張はグロテスクだ。
なので、低レベルの処理はCで、高級な処理はC++以外の言語でというのが理想。
0037デフォルトの名無しさん
2008/04/08(火) 03:06:25テンプレートがあるので問題ナス
C++0xやTR2が実装されれば、かなり便利になる・・・
が何年先になるか不明
あと最近知ったけど、Cもちゃんと次の標準に向けてがんがってるのね
http://www.open-std.org/JTC1/SC22/WG14/
0039デフォルトの名無しさん
2008/04/08(火) 15:13:49だいたい、ライブラリをバイナリで落としてそのまま使える気がしない。
というか、それが問題なく使えることってあんのか?
ビルドに苦労することはよくあるけど、それは何の言語でも同じだろ。っていうか
それは言語とは関係ないし。
0040デフォルトの名無しさん
2008/04/08(火) 22:49:51C++から C には・・・もう戻れないに一票
>>3, >>5 に共感そのもの
>>9 そうかな?必要と感じるなら立ち上げたら?
>>13 ちょっと理解できない。オブジェクト指向では
object a, b, c;
add (&c, &a, &b) の表現ではなく
c = a + b; と記述できる処だよね。
add はそのまま operator + で同じような内容だし後は operator = だけでしょ。operator - がいるなら当然 sub も書くことになるんだから工数は何も変わらない。
>>16 というか領域・空間のチェックはしてない。そこがマニアックたる処だと思う。C は好きです。
overload は実行時に都度確定する部分だから細かく気にする人は精神的によくないかもね。
>>26 ばりばりに C++ してたら C には戻れんと思うが・・・
struct , class メンバー使い出したらそれだけでも C++ から C には戻れない。
>>36 中途半端なスタンスがいい。厳格なオブジェクト指向な実装が好きな人はそれを使えばいい。だけど C をカジってた人ならきっと窮屈に感じると思う。それにオブジェクト指向から手続き型には戻れんと思う。
0041デフォルトの名無しさん
2008/04/09(水) 00:04:29オーバーロードの解決はコンパイル時だぞ。
オーバーライドとごっちゃにしていないか?
あと、演算子の件はoperator +=も用意するとか、
2つの型が関わる場合に、
operator +(T1 const&, int const&)と
operator +(int const&, T1 const&)のように
いくつも関数を作らないといけないということを言っているのだと思われる。
0042デフォルトの名無しさん
2008/04/09(水) 00:21:39>低レベルの処理はCで、高級な処理はC++以外の言語でというのが理想。
俺もこれに一票。
DTrace とか使ってると C++ のマングリングが鬱陶しいし。
0043デフォルトの名無しさん
2008/04/09(水) 01:51:05Cに比べればstringがある分、文字列処理もましだし(それでもきついけどw)
0044デフォルトの名無しさん
2008/04/09(水) 15:11:53> オブジェクト指向では
> object a, b, c;
> add (&c, &a, &b) の表現ではなく
> c = a + b; と記述できる処だよね。
演算子オーバーロードとオブジェクト指向は何の関係もないと思うが。
>>40はいろいろと微妙に分かってない罠。
0045デフォルトの名無しさん
2008/04/09(水) 20:50:200046デフォルトの名無しさん
2008/04/10(木) 00:42:15だけど、それは C でも同じでは?
C なら型が違う毎に add1() add2() とするでしょし operator += が必要なら append() とかを書くことになるのでは?
後、メンバー関数が継承される時 virtual な扱いにいつされるかというところがあるとおもう。operator が別扱いではないですよね。
>>44
そうかな。関係ないのだろうか?
オブジェクトにメッセージを送るという感覚、これまでの add(a, b) ではなく独自の struct あるいは class な物にたとえば c = a + b という記述ができることであって、一例として挙げている演算子再定義にこだわり過ぎてない?
で、指摘の通りきっと微妙に判っていないんだとは思う。厳格なオブジェクト指向は触ったことないし神髄は未知の世界です。
0047デフォルトの名無しさん
2008/04/10(木) 00:58:13ところが>>13も言っているが、Cだとわざわざappendなんて用意しないし、
複数の型がからむときも、41のoperator +のように
右辺と左辺が入れ替わっただけの関数なんて用意しない。
C++だってBoost.Operatorsでその点はばっちり解決できるんだけどな。
0048デフォルトの名無しさん
2008/04/10(木) 13:46:00でも、Boost.Iterators使おうとしたとき、マニュアルとヘッダ読みながら何とか
コンパイルに成功したが、あの小一時間あれば自分でイテレータに必要なもの
全部書けるなとおもた。
あの手の実装補助は相当使いこなさないと、効果ないかも。
話逸れたけど、ここにはCマンセーの人はいないの?
0049デフォルトの名無しさん
2008/04/10(木) 18:46:43でも、今から手続き型のスタイルにもどるって時代逆行では?
先輩方が手続き型で痛い目を見て、少しでもミス記述が防げるには?…と考えてきたと思うし・・
>>47
ごめん。どうもよくわからない。必要ない物を用意しないのは同じでは。 append が必要ないなら当然 operator += も必要ない。
そもそも operator += じゃなく C スタイルで append で何も不具合はないわけだし(コード書く人の気持ち一つ)
ところでここで C という人は C++ なメンバー関数であったりそういうのが本当にいらないって事を言ってるのだとしたら・・orz
0050デフォルトの名無しさん
2008/04/10(木) 20:40:47そりゃそうなんだけど、現実は
Cのライブラリ:add 1つだけ
C++のライブラリ:operator +に+=、++全て勢揃い
となっていうことがなぜか多い。
(もちろんCでappendの実装が困難というわけではない)
0051デフォルトの名無しさん
2008/04/11(金) 15:03:090052デフォルトの名無しさん
2008/04/11(金) 17:31:20kwsk
0053デフォルトの名無しさん
2008/04/12(土) 05:19:11一度しか使わないなら大抵の小物ライブラリがそうだよね。
何度も使うから効果を発揮するわけで。
0054デフォルトの名無しさん
2008/04/13(日) 00:57:09c = a + b とできるようにしたけど、
一時オブジェクトの生成がオーバーヘッドになって使えなかった。
add( vector &c, const vector &a, const vector &b ) にしてから全体の計算が
10秒から2.5秒まで落ちた。 正確なデータ、根拠じゃないけど速く感じたのは
事実だった。
オーバーロード自体はきらいじゃないけど、こういうときは無理にする必要は
ないよね。冷静に考えると自作クラスに演算子を用意するのって実は
限られている希ガス。(代入演算子はとか除いて)
ちなみに自分はC++派。上の関数をインラインにするだけでさらに速度アップするし。
あと、add_assign() とかも用意した。
0055デフォルトの名無しさん
2008/04/13(日) 01:16:230056デフォルトの名無しさん
2008/04/13(日) 01:26:570057デフォルトの名無しさん
2008/04/13(日) 01:29:00RVO が利用できるよう、演算結果を初期化で受けると
オーバーヘッドは減らせる。
あるいは c += a + b; みたいに使うとか。
0058デフォルトの名無しさん
2008/04/13(日) 01:33:470059デフォルトの名無しさん
2008/04/13(日) 22:13:42それって何かが間違ってる。
add() が + () という名前に変わるだけ。
+ という関数名はそのまま使えないから operator でそうしてる。実際の呼び出しに差違が起こるのは・・何かが可笑しい。と思うが。
0060デフォルトの名無しさん
2008/04/13(日) 22:36:11+ 演算子は仕様上結果を戻り値で返す事しか出来ないからね。
0061デフォルトの名無しさん
2008/04/14(月) 02:34:500062デフォルトの名無しさん
2008/04/14(月) 18:09:440063デフォルトの名無しさん
2008/04/14(月) 20:08:20いらないと思ったらその機能を使わなければいいだけ
0064デフォルトの名無しさん
2008/04/14(月) 20:37:23そう感じてもおかしくはないね
0065デフォルトの名無しさん
2008/04/15(火) 09:20:08まあ組み込みなので
0066デフォルトの名無しさん
2008/04/24(木) 20:41:46すまん。そのとおりだ。
0067デフォルトの名無しさん
2008/05/15(木) 14:02:26inline 関数の機能がなくても最適化できるのが理想だが、現実的にそれができるコン
パイラやリンカは少ないので inline を追加してほしい。
C99 は C++ との互換性に問題があるから使いたくない。
0068デフォルトの名無しさん
2008/05/15(木) 14:06:110069デフォルトの名無しさん
2008/05/15(木) 14:35:490070デフォルトの名無しさん
2008/05/15(木) 14:40:24すみません。コンパイラは自分で選べないケースもあるんです。
0071デフォルトの名無しさん
2008/05/15(木) 14:48:19個人的にはそれを主張しているのですが、お客さんが C++ は絶対ダメって言うんです。
0072デフォルトの名無しさん
2008/05/15(木) 15:06:55C++でないって言い張ればいいじゃない
0073デフォルトの名無しさん
2008/05/15(木) 16:45:44顧客によっては MISRA-C などのソース検査を要求しますが。
0074デフォルトの名無しさん
2008/05/15(木) 17:43:360075デフォルトの名無しさん
2008/05/15(木) 19:52:28実装した場合、ライブラリユーザー側のデメリットって何かありますか?
0076デフォルトの名無しさん
2008/05/15(木) 22:09:31ライブラリのコンパイルが必要になるんじゃなかったっけ
0077デフォルトの名無しさん
2008/05/15(木) 23:03:40それらを使わなければ、巧く共存できる。
0078デフォルトの名無しさん
2008/05/16(金) 00:52:32影響を受けないんじゃないかな。.so の仕組みは少し違うのかな。
0079デフォルトの名無しさん
2008/05/16(金) 16:21:58C++ で実装しないのかな。
Linux OS 自体の実装も C とアセンブラだけかな。
0080デフォルトの名無しさん
2008/05/16(金) 20:31:11今は Palm が買い取った筈だけど…
C++ だと C や他の言語から呼び出すのが面倒だから止めて欲しい。
0081デフォルトの名無しさん
2008/05/16(金) 23:17:450082デフォルトの名無しさん
2008/06/19(木) 22:05:060083デフォルトの名無しさん
2008/06/20(金) 13:16:210084デフォルトの名無しさん
2009/01/27(火) 13:04:52最低でもこの3つが無いとCに戻る気には慣れんなぁ。
オプソのCのコードやOpenGLのコードなんかを見れば分かるけど
手動名前空間で関数名がクソながかったり、関数名に型名が混在したり
名前が汚すぎる。人が用意したコードならともかく自分のコードであんな命名
規則を守りつづける気がしない。
0085デフォルトの名無しさん
2009/01/27(火) 16:16:39テンプレート必要だろjk
0086デフォルトの名無しさん
2009/01/28(水) 21:00:46参照カウントみたいなことを人間の手でやっていたら絶対どこかで間違うはず。
0087デフォルトの名無しさん
2009/02/01(日) 14:56:070088デフォルトの名無しさん
2009/02/01(日) 15:17:480089デフォルトの名無しさん
2009/02/01(日) 17:38:32あくまで最低ラインだからねー。
テンプレートなら今でも不自由な環境あるじゃん。
そんなかんきょうでも、俺は>>84が満たされていればC++を選ぶ。
でも、>>84すら不自由なら流石に手を引くけどな(例:Embedded C++)
0090デフォルトの名無しさん
2009/03/19(木) 10:35:200091デフォルトの名無しさん
2009/06/10(水) 04:58:230092デフォルトの名無しさん
2009/10/11(日) 11:14:060093デフォルトの名無しさん
2009/10/14(水) 17:46:22理由よくわかんないけどCのほうが早く作れる気がする
のろわれてんのか?
0094デフォルトの名無しさん
2010/02/25(木) 18:25:460095デフォルトの名無しさん
2010/02/27(土) 14:11:53最適な組み合わせが閃かなかったりする。
0096デフォルトの名無しさん
2010/03/09(火) 01:42:51自分の場合、結局Cでも使える関数のエクスポートに落ち着いちゃう。
0097デフォルトの名無しさん
2010/03/09(火) 07:22:54まあこのあたりは言語の話でいいのか微妙だな
所詮拡張機能だし
0098デフォルトの名無しさん
2010/05/26(水) 20:29:32ハンドルと関数を公開してC++用のヘッダにラッパー書くのが一番簡単かな
0099デフォルトの名無しさん
2011/01/11(火) 19:02:40http://lwn.net/Articles/249460/
0100デフォルトの名無しさん
2011/01/11(火) 19:30:000101デフォルトの名無しさん
2011/02/15(火) 22:47:30それに対する反論。
http://warp.povusers.org/OpenLetters/ResponseToTorvalds.html
http://slashdot.jp/~taro-nishino/journal/501622
0102デフォルトの名無しさん
2011/02/16(水) 03:49:28for(i = 0; i < strlen(line); i++)
{
...
doSomethingWith(line);
...
}
そのようなことをするのは非常に非効率だ。ループの外で(特にdoSomethingWith関数がconstでないポインタを取るならば)
コンパイラはstrlenの最適化すら出来ないだろう(コンパイラは、その関数が文字列を変更するかどうか分からないからである)。
確かに、答えは"そのようなことをするな"だ。しかし、Cは初心者プログラマにそのようなコードをするのを助長している。
それが全く自然な考え方であるのだ。
今や、C++での自然な考え方により、同じことをC++ではどのようにするか比べよう。
for(i = 0; i < line.length(); i++)
{
...
doSomethingWith(line);
...
}
これはCバージョンと非常によく似ているが、ずっと効率的だ(std::string::length()はただメンバー変数の値を返し、
呼ばれる度に文字列の長さをカウントする必要が無いからである)。たとえ文字列がループ本体の中で変更されても
効率的であることに注意せよ。
0103デフォルトの名無しさん
2011/02/16(水) 03:56:27> for(i = 0; i < strlen(line); i++)
そもそもこれが自然じゃないだろw
先に筋書きありきで、無理矢理こじつけ様とするからこうなる
0104デフォルトの名無しさん
2011/02/16(水) 09:29:22そうか?実際けっこう見たことあるよ。
> 確かに、答えは"そのようなことをするな"だ。しかし、Cは初心者プログラマにそのようなコードをするのを助長している。
> それが全く自然な考え方であるのだ。
0105デフォルトの名無しさん
2011/02/16(水) 10:30:14性能が重要な箇所で、loop の判定式の中で関数を使うなんて素人だろ
平均的 C++ が書く C のコードはこんなもんなのかもしれんが、
平均的 C プログラマはそんなコードは書かない
>>102 の論理はどう考えても無理筋
0106デフォルトの名無しさん
2011/02/16(水) 10:34:21× 平均的 C++ が書く
○ 平均的 C++ プログラマが書く
失敬した。
0107デフォルトの名無しさん
2011/02/16(水) 10:37:59だから、素人の話をしてるんだよ。
> しかし、Cは初心者プログラマにそのようなコードをするのを助長している。
0108デフォルトの名無しさん
2011/02/16(水) 10:39:32> 以下は平均的Cプログラマによって作成され、
> 以下は平均的Cプログラマによって作成され、
> 以下は平均的Cプログラマによって作成され、
0109デフォルトの名無しさん
2011/02/16(水) 10:42:46>>102 は相当 Linus が嫌いなんだろうなw
普通に考えたら >>102 は無いわ
0110デフォルトの名無しさん
2011/02/16(水) 10:48:29あ、そこに引っかかってるのか。「平均的」っていうのは個人の経験で揺れちゃうんで、
確かにそこがおかしく見えることもあるだろうな。
>>109 の「普通」も同様。
0111デフォルトの名無しさん
2011/02/16(水) 10:51:310112デフォルトの名無しさん
2011/02/16(水) 11:41:12> そこに引っかかってるのか
> 個人の経験で振れちゃうんで
ワラタw
今度は「貴方の勘違いです」作戦ですか?
理屈も糞も無いなw
俺は素直さが美徳の世界に戻るわ
0113デフォルトの名無しさん
2011/02/16(水) 11:50:19いや、勘違いだなんて言ったつもりはないよ。
筆者にとっては正しくて、あんたにとっては正しくない。それだけのこと。
0114デフォルトの名無しさん
2011/02/16(水) 17:04:420115デフォルトの名無しさん
2011/02/16(水) 17:16:450116デフォルトの名無しさん
2011/02/16(水) 22:42:30>>102 はいちばん突っ込みやすそうなところを晒し上げしただけだろ。
0117デフォルトの名無しさん
2011/02/17(木) 05:10:15(getsがセキュアでないのはCプログラマなら常識で、普通使わないし、使われていない)
仮想しているCプログラマのレベルが低すぎる。
0118デフォルトの名無しさん
2011/02/17(木) 07:50:330119デフォルトの名無しさん
2011/02/17(木) 10:22:53C PG : 「そんな糞コード書くかよw」
0120デフォルトの名無しさん
2011/02/17(木) 11:32:060121デフォルトの名無しさん
2011/02/17(木) 13:43:13「C++は多くの平均以下のプログラマが使っている」
って点だが、それすらも >>101 のリンク先の反論の
あまりのヘボさによって例示されてしまっている。
0122デフォルトの名無しさん
2011/02/17(木) 14:30:390123デフォルトの名無しさん
2011/02/18(金) 00:43:04> Linusの主張で唯一根拠が無いのが
リンク先の記事では「まともな根本を持っているのは唯一つである」とされていて、
それは「STLデータコンテナを使えば、一部の古いC++コンパイラがサポートしていない場合がある」という点
だけみたいなんだけど、他の点には根拠があると言えるの?
0124デフォルトの名無しさん
2011/02/18(金) 01:11:46C PG : 「お前、普段バイクに乗ってる人間が、自転車でも速く走れると思ってるのか?」
0125デフォルトの名無しさん
2011/02/18(金) 02:21:17デバッグが苦痛なのも(何あのエラーメッセージ?)、
C++で良いとされるプログラミングパラダイムがころころ代わるのも
(昔は継承使うのが良いとか言ってませんでしたっけ?)、
事実だろ?
0126デフォルトの名無しさん
2011/02/18(金) 02:52:44説得出来た所で何の益も無いし
0127デフォルトの名無しさん
2011/02/18(金) 03:53:23アクセスできて高機能、だからグローバル変数を使おう
とか言ってたら頭オカシイと思うだろ?
それと同様に、C++はCの仕様を全て含んでいるから
Cより悪いはずが無い、って主張は愚かすぎる。
言語仕様だって適切に制限されているべきなんだよ。
0128デフォルトの名無しさん
2011/02/18(金) 08:10:470129デフォルトの名無しさん
2011/02/18(金) 08:25:56語ってて、突っ込み入れる外野はもっと緩い作業を想定してるのが
モメてる根本だろ?
0130デフォルトの名無しさん
2011/02/18(金) 09:18:48カーネルやデバイスドライバだと C++ を使わない理由が出てくると思ってるなら、
何か C++ について勘違いしている可能性が高い。
件の反論にも同様の指摘がある。
> 彼はまた、C++コーダーは"低レベル問題を理解"出来ないと主張する。 ...
どんな理由でそれらに C++ が適さないと思ってるの?
0131デフォルトの名無しさん
2011/02/18(金) 09:21:53C PG : 「オブジェクト指向的に書きたい時は素直に Java か ObjC を使うだろ・・・」
0132デフォルトの名無しさん
2011/02/18(金) 09:37:17それは事実だが、 C で同等のことをより適切なエラーメッセージを得ながら
できるわけじゃないでしょ?(マクロでやればもっとエラーは不可解になる。)
そもそも Linus はそんなこと主張してないし、反論でもそれを否定するような
主張はしていないし、誰もそんな話はしていない。
0133132
2011/02/18(金) 09:48:41> - infinite amounts of pain when they don't work (and anybody who tells me that STL
> and especially Boost are stable and portable is just so full of BS that it's not even funny)
> - inefficient abstracted programming models where two years down the road
忘れて。
0134デフォルトの名無しさん
2011/02/18(金) 10:17:48C PG : 「テンプレートで頑張るとエラーメッセージが理解不能になるし、コンパイルが劇的に遅くなるって君が教えてくれたんじゃん・・・」
0135デフォルトの名無しさん
2011/02/18(金) 10:25:11気を使いながらカーネル書いてるCプログラマに、
「デストラクタでRAIIすれば資源管理も楽勝っすよw」
なんてレベルのC++プログラマが話しかけてきたら、
あっち行けって言いたくもなるよ。
0136デフォルトの名無しさん
2011/02/18(金) 10:54:32レスポンスタイムにシビアな制限のあるデバイスドライバでSTLコンテナ使う場合とか?
コンテナ自体の速度がどうしても間に合ってない→結局自作→なら最初から自作でいいだろ
みたいな流れで。
0137デフォルトの名無しさん
2011/02/18(金) 10:59:37なんで RAII がスタックサイズに関係すると思ってるの?
0138デフォルトの名無しさん
2011/02/18(金) 11:01:33標準コンテナの何が速度低下に関係するの?
百歩譲って、コンテナの自作が「どうしても間に合わないとき」に
限定されるんならそれだけでも十分役に立ってるじゃないか。
0139デフォルトの名無しさん
2011/02/18(金) 11:28:32じゃあLinusは時代遅れの老害だからアホな事ほざいてるだけなの?
0140デフォルトの名無しさん
2011/02/18(金) 11:34:03これは、単に、Cで普通に使われる文字列はヌル文字の番兵で終端を表しているだけで
自分の長さを知らないデータ構造なので、
文字列長を知るにはいちいちO(n)のstrlen()を利用する必要があり
それ自体が非効率な仕組みだ、と言えばよかったのにな
まともなCプログラマならそれを知っているから、ループの中でstrlen()を呼んで
いちいちO(n)をO(n^2)に悪化するようなことはしない
もっともいずれにせよstrlen()は必要で、その時点で既に非効率なわけだが
勿論Cで文字列長を自分で保持する構造を書くことは勿論できるけど
C++でも標準ライブラリを捨てていくらでも自分で書けるわけで
C++の標準ライブラリやboostを攻撃するのなら、Cのgets()やstrlen()が
攻撃されるのも理解しなきゃな
「使わなければいい」というのなら、C++のSTLだって、使わなきゃいいだけなんだ
0141デフォルトの名無しさん
2011/02/18(金) 11:34:18スタックが巻き戻るときに自動的に呼ばれるデストラクタで
資源解放するのがRAIIだからだろ。
それとも資源管理を明示的に書くのをサボるためだけに
スマートポインタを使うのか?スマポだって生ポインタよりは
スタック消費するぞ。
0142デフォルトの名無しさん
2011/02/18(金) 11:38:21scoped_ptrはきっかり生ポインタと同じだけしか領域を消費しませんよ
もちろん、多機能なshared_ptrならもっとオーバーヘッドがあるけど
やりたいことが単なるRAIIで、スタックに積むかわりなら
scoped_ptrで十分でしょう
0143デフォルトの名無しさん
2011/02/18(金) 12:56:01スマポのデストラクタ -> オブジェクトのデストラクタ
の二段階呼び出しのスタック消費の両方を念頭に置いてたんだ。
でも、少なくとも前者は scoped_ptr があるし、
後者も最適化で消せるみたいだ。
完全にこっちの見識不足だった。
0144デフォルトの名無しさん
2011/02/19(土) 01:57:30その言い方はちょっと違うな。老害ってやつじゃない。
C を使ってる分にはすごく優秀なプログラマと見て間違いないはず。
>>101 のリンク先の言葉を借りれば、「Cハッカー症候群」 "C-hacker syndrome" 。
症例はこのスレにたくさん挙がっている。
0145デフォルトの名無しさん
2011/02/19(土) 07:13:00>自分の長さを知らないデータ構造なので、
>文字列長を知るにはいちいちO(n)のstrlen()を利用する必要があり
>それ自体が非効率な仕組みだ、と言えばよかったのにな
無知でスマソ。
C++ の文字列も結局は内部でひっそりと文字数をカウントしているんだよね?
それは strlen() を使うのと計算量が大幅に異なる様なデータ構造になってるの?
0146デフォルトの名無しさん
2011/02/19(土) 08:06:400147デフォルトの名無しさん
2011/02/19(土) 08:16:430148デフォルトの名無しさん
2011/02/19(土) 08:26:350149デフォルトの名無しさん
2011/02/19(土) 08:37:48変数で文字数を保持してる
0150デフォルトの名無しさん
2011/02/19(土) 08:37:590151デフォルトの名無しさん
2011/02/19(土) 08:38:50>>150 は >>148 だった
>>149
誰が文字数を変数に格納するの?
0152デフォルトの名無しさん
2011/02/19(土) 08:50:090153デフォルトの名無しさん
2011/02/19(土) 09:14:260154デフォルトの名無しさん
2011/02/19(土) 09:20:22それって結局内部的に計算してるってことだよね?
0155デフォルトの名無しさん
2011/02/19(土) 09:24:390156デフォルトの名無しさん
2011/02/19(土) 09:26:170157デフォルトの名無しさん
2011/02/19(土) 09:29:06文字数のカウントが速いんだとか、そういった分かり易いシンプルな説明って無いの?
0158デフォルトの名無しさん
2011/02/19(土) 09:41:01午後の部を待つか・・・
0159デフォルトの名無しさん
2011/02/19(土) 09:53:300160デフォルトの名無しさん
2011/02/19(土) 11:28:50string同士の操作はお互いに文字数が分かってるのでカウントしなおさない。
const char* が含まれる場合は1回だけstrlen相当の処理が使われる。
0161デフォルトの名無しさん
2011/02/19(土) 15:41:49どうもありがとう。
文字列のコピーや連結の時にショートカットが出来ると言う事かな。
それだけの事であれば、文字列長のカウントがホットスポットになった場合に、
C で同じ様な実装をするのは雑作無い事だよね。
ある文字列の先頭の 5 文字を除いた文字列を関数に渡したいと言った時に、
C ならポインタを 5 文字分だけずらして渡してあげればいいだけだけど、
C++ の文字列では、文字数情報を記憶しないといけないので、わざわざ
substr() みたいな関数呼び出しにしないといけないんだよね?
こっちのオーバーヘッドの方が無駄じゃないの?
0162デフォルトの名無しさん
2011/02/19(土) 16:16:54string.c_str() + 5 とかで渡せる。(ちゃんとnullストップになってる。)
挿入したい場合は挿入用のメンバ関数がある。
0163デフォルトの名無しさん
2011/02/19(土) 16:20:57単に良く分からないから嫌っているってだけのことが
*非常に*多いのがこのスレを見ていても良く分かるね
よく分かっている道具を使うのは間違いじゃないし正しい態度でもあるが、
よく知らないものを知らないくせにdisるのはバカのやることだな
0164デフォルトの名無しさん
2011/02/19(土) 16:29:03その関数が C の文字列を受け取る関数ならその通りだけど、
C++ string を受け取る関数なら、やはり何らかの事前処理が
必要になるよね
>>163
俺はこれが気になったから質問してるだけだよ
>これは、単に、Cで普通に使われる文字列はヌル文字の番兵で終端を表しているだけで
>自分の長さを知らないデータ構造なので、
>文字列長を知るにはいちいちO(n)のstrlen()を利用する必要があり
>それ自体が非効率な仕組みだ、と言えばよかったのにな
C++ の文字列って C の文字列を dis れる程、効率的な物
なのか知りたくなってね
0165デフォルトの名無しさん
2011/02/19(土) 16:33:12効率が気になるなら試せよ。
0166デフォルトの名無しさん
2011/02/19(土) 16:36:37そんな良い物ではないよw
for内でstrlen使っちゃうような、うっかり八兵衛には効率的なのかもしれないが。
0167デフォルトの名無しさん
2011/02/19(土) 16:37:09>>140 がああまで言う理屈が分からないと、テストパターンも作れないでしょ
0168デフォルトの名無しさん
2011/02/19(土) 16:40:28だから挿入用や上書き用のメンバも何種類もある。
何文字目から始める&終わるか引数で渡せる。
Cのポインタみたいなノリで書きたい場合は、イテレータという物もある。
0169デフォルトの名無しさん
2011/02/19(土) 16:41:10要は、適材適所なんだからどの方式も一概に否定したもんじゃないさ。
0170デフォルトの名無しさん
2011/02/19(土) 16:46:30ありがとう。やっぱりそうなんですね。
C++ が実行効率に神経を注いでるのは聞いていたので、
何かいい仕組みがあるのかもと期待しちゃいました。
>>168
今していたのは C++ と C の文字列の計算量の話
その何種類もあるメンバも内部的に計算してるわけでしょ
そしたらその分の計算量が発生するでしょ
繰り返しになるから、これ以上は説明しませんので、
お願いします・・・
0171デフォルトの名無しさん
2011/02/19(土) 16:47:04C で C++ っぽくは書けないお。
C++ だからって string を使わにゃならんわけじゃなし。
0172デフォルトの名無しさん
2011/02/19(土) 16:49:15ただし、>>168の言っているように、C++では本当にジェネリックなアルゴリズムとして
記述する場合はSTLのようにテンプレートとiteratorが使われる
この場合は本質的に効率はポインタと同等でありながら、データ構造の内部表現を
問わない
charのストリーム、charのリスト、charの配列、stringを全く同じテンプレート関数に
適用できるということだ
Cならアダプタか、別々の実装を書く必要があるだろうな
また、特にstringで受ける必要が無い関数なら、C++であってもconst char *
もよく使われるよ
0173デフォルトの名無しさん
2011/02/19(土) 16:52:07文字数のみを考えるなら、こんな感じの構造体と
それを操作する関数を用意してあげれば良いだけ
typedef struct { int len; char str[] } string;
0174デフォルトの名無しさん
2011/02/19(土) 16:52:59ある std::string から先頭 5 文字を取り除いたものを std::string として渡すんなら、
substr() するか先頭を erase() したものを渡すことになる。そんなに効率的じゃない。
でもこれを以って「やっぱり C のほうがいい」なんてことにはならないでしょ?
先頭 5 文字削るのは直感的で効率のいいコードになるけど、後ろ 5 文字削るとか
途中 5 文字削るとか、ちょっとした違いでコードも効率も全然違ったものになってしまう
のは理不尽だよ。
ちなみに、そういう処理を効率的にするためのものとして、標準じゃないけど
StringPiece ってのがあったりする。
http://d.hatena.ne.jp/shinichiro_h/20100823
> http://src.chromium.org/viewvc/chrome/trunk/src/base/string_piece.h
C で同様の機能のライブラリを作ることもできるだろうけど、これより良いものには
できないでしょ。
0175デフォルトの名無しさん
2011/02/19(土) 16:53:29ポインタ+位置差分の加算等のことを言ってるのなら、
イテレータでポインタライクに操作できるんだって。
先頭の位置は変数(ポインタ)で保持される。
0176デフォルトの名無しさん
2011/02/19(土) 16:55:47CではC++と違ってカプセル化によってデータ構造の整合性が常に保たれることを
保障することが難しい
Cでカプセル化したければ、opaqueポインタ経由でユーザにアクセスさせるように
してデータ構造を隠すしかないが、stringクラス的な用途ではそうするのは非効率だ
この辺も、Cでパスカル文字列が採用されなかった理由のひとつだろうと思う
ただの創造だが
0177デフォルトの名無しさん
2011/02/19(土) 16:56:29うんそういうこと。でもそれを全ての文字列操作関数に対応させたり、
さらには非標準の文字列操作ライブラリにも広く対応させたり
自分の力だけでやるのは大変でしょ?
そういう標準化、規格化として意味があるわけです。
0178デフォルトの名無しさん
2011/02/19(土) 16:56:45関数に渡す文字列の話だよ?
0179デフォルトの名無しさん
2011/02/19(土) 16:58:39だから、関数が「stringで受けるように作ってあれば」
部分文字列を渡したければsubstrを使う必要があり、それがO(n)なのはその通り
だが、C++で関数をそう作る必要はどこにもない
iteratorで受けてもポインタで受けてもいい
要求に応じて適した選択が選べるということ
0180デフォルトの名無しさん
2011/02/19(土) 17:01:08C の方が良いと主張したいわけじゃないです。
C++ の文字列の方が優れているという人がいたので、
それは誤解じゃないの? と聞いてみた次第です。。。
0181デフォルトの名無しさん
2011/02/19(土) 17:02:51自分で作る関数に付いては、もちろんその場で一番効率が良い実装をするのが
当たり前だと思います
0182デフォルトの名無しさん
2011/02/19(土) 17:06:53標準の文字列型として、所有権・寿命の管理を気にしなくても使えるようにするのが主目的だから、
効率だけ見てどっちが優れているかを考えるのは不毛なこと。
その中でも、文字列を変更しない間に繰り返し長さを得る場合には std::string のほうが効率的な
「こともある」と挙げているのが元の記事。はじめから、すべての場合で効率的であると主張して
いたわけじゃない。
0183デフォルトの名無しさん
2011/02/19(土) 17:08:53書けば大抵Cのほうが速いだろうけどな
重要な違いが出るかどうかはともかく
ただまあ、明らかにC++のが速いことが分かってるものもいくつかある
qsort()に対するstd::sort()とか
0184デフォルトの名無しさん
2011/02/19(土) 17:17:59と思ったほうが楽なこともある
ないよりはあるほうがいい場合もあるが、すべての場合ではない
0185デフォルトの名無しさん
2011/02/19(土) 17:19:300186デフォルトの名無しさん
2011/02/19(土) 17:36:300187デフォルトの名無しさん
2011/02/19(土) 17:44:28設定ファイルを読み書きするようなところではstd::stringで、
必要なら外部の正規表現ライブラリでもなんでも使って、
こういう風に選択できるところがC++のいいところなんだってば。
ちょっとしたテキストビューワが必要なときに、テキストエディタで要求されるような
行単位のリスト構造を一一作らないときがすまないようなロートルCプログラマには
理解し難いことなのかもしれないけれど。
0188デフォルトの名無しさん
2011/02/19(土) 17:46:49GC もあるし GUI も完備
0189デフォルトの名無しさん
2011/02/19(土) 20:01:17.96Cで書かなきゃならん部分だけCで書いて、
それ意外の部分はshなりPerlなりPythonなりで
書くのがCプログラマなんで、その指摘は的外れかと。
C++プログラマはC++の中だけで機能を選択するが、
Cプログラマは言語の枠を超えて機能を選ぶ。
0190デフォルトの名無しさん
2011/02/19(土) 20:08:05.79なんで C++ プログラマは「shなりPerlなりPythonなり」を使わないと思ってるの?
0191デフォルトの名無しさん
2011/02/19(土) 20:10:24.84C で 187 みたいなことできるの?
0192デフォルトの名無しさん
2011/02/19(土) 20:11:15.88ロートルだからじゃね?
0193デフォルトの名無しさん
2011/02/19(土) 20:15:44.66慣れるまで大変で。
0194デフォルトの名無しさん
2011/02/19(土) 20:38:32.190195デフォルトの名無しさん
2011/02/20(日) 00:38:01.750196デフォルトの名無しさん
2011/02/20(日) 04:15:04.36実装読めよ馬鹿。
0197デフォルトの名無しさん
2011/02/20(日) 04:17:12.610198デフォルトの名無しさん
2011/02/20(日) 08:37:19.59C++でCに追加された構文的拡張は、
それらの言語ではより良く(より簡潔に、またはより一貫性のある形で)
実装されているので、それらの言語も使える場合
C++を使う理由は実行速度くらいしかない
(Cと併用できるならそれすら無い)
0199デフォルトの名無しさん
2011/02/20(日) 08:54:53.51手間は増えると思うんだ。
0200デフォルトの名無しさん
2011/02/20(日) 08:56:54.712、3個の言語を組み合わせる程度なら追加の手間はないと思うよ
0201デフォルトの名無しさん
2011/02/20(日) 09:10:11.44把握する手間に比べれば、どってことないよな。
0202デフォルトの名無しさん
2011/02/20(日) 09:17:05.830203デフォルトの名無しさん
2011/02/20(日) 09:19:43.210204デフォルトの名無しさん
2011/02/20(日) 09:24:58.920205デフォルトの名無しさん
2011/02/20(日) 09:43:01.170206デフォルトの名無しさん
2011/02/20(日) 11:45:57.19え?
>189 にある「Cで書かなきゃならん部分」ってのも実行速度が欲しいところぐらいじゃないの?
他になんかある?あったとしてもC++では書けない、なんてことあるの?
0207デフォルトの名無しさん
2011/02/20(日) 14:50:52.10C PG : 「gets() の事ならもうずっと誰も使っていないし、2012 年に予定されている次の仕様で削除される予定だぞ」
0208デフォルトの名無しさん
2011/02/20(日) 18:24:03.29このスレッドを読んできて、それでも「書けるか書けないか」
が争点だと思えるなら理解力が無さすぎる。
CのほぼスーパーセットのC++で書けないなんてことが
あるわけないだろ。
問題点になっているのは、いわば「読みやすさ」。
0209デフォルトの名無しさん
2011/02/20(日) 18:42:39.03なんで C++ で書くと読みやすさが損なわれると思ってるの?
0210デフォルトの名無しさん
2011/02/20(日) 18:48:15.29ロートルの人が読めるかどうかです
0211デフォルトの名無しさん
2011/02/20(日) 19:03:36.830212デフォルトの名無しさん
2011/02/20(日) 19:21:18.05その時々で流行のパラダイム(OOPとか)をサポートする
構文糖が節操無く追加された結果、言語のデザインに一貫性が無い。
一貫性が無いから、構文糖がどのような暗黙的コードを生成するかは
単純に暗記するしかなく、さらに複数の異なる暗黙的コードの相互作用が
様々な罠を張ってて、簡単に自分の足を打ち抜けるようになってる。
ただ罠を避けるためだけの本(Effective C++とか)が必読本の時点で
何かおかしいと感じるべき。
こんな言語が読みやすいというなら、読みやすさは
プログラミング言語の評価基準にならないよ。
0213デフォルトの名無しさん
2011/02/20(日) 19:33:01.14まあ、確かに C++ は罠が多いけど
ヤバい所は使わずに美味しいところだけ使うこともできる。
C は、できないよね。
0214デフォルトの名無しさん
2011/02/20(日) 19:37:40.43純粋仮想関数が = 0 って糞ワラタw
0215デフォルトの名無しさん
2011/02/20(日) 19:44:11.93そのコードがどう実行されるかが比較的判りやすい言語だ。
もちろんマクロやグローバル変数等を使ってそうじゃなくすることも可能だけど、
そういうコードは「悪いコード」だとする文化がある。
一方、C++はコードをより広いコンテクストに依存させる構文糖
を積極的に追加する上に、どういうコードが良いコードか
(例えば、ある構文糖をどういう場合に「使わない」かについて)
の文化すら存在しないので、あるコードが何をしているか把握するのに
ずっと多くのコードを読まなきゃいけない。
だからC++は読み難いんだよ。
0216デフォルトの名無しさん
2011/02/20(日) 19:45:12.140217デフォルトの名無しさん
2011/02/20(日) 19:48:48.72Cだって正しく使おうと思ったら暗記しないといけないことは山ほどある。
未定義動作とか副作用完了点とか。 C FAQ にいろいろ載ってるよね。
> 複数の異なる暗黙的コードの相互作用が様々な罠を張ってて
これは、なんのことだろう?ひとつでも例を挙げてみてもらえないか?
0218デフォルトの名無しさん
2011/02/20(日) 19:50:33.20> もちろんマクロやグローバル変数等を使ってそうじゃなくすることも可能だけど、
> そういうコードは「悪いコード」だとする文化がある。
なんで C++ だとそんなのが受け入れられると思ってるの?
0219デフォルトの名無しさん
2011/02/20(日) 19:51:35.890220デフォルトの名無しさん
2011/02/20(日) 19:53:33.870221デフォルトの名無しさん
2011/02/20(日) 19:54:45.800222デフォルトの名無しさん
2011/02/20(日) 19:59:12.96例えば、コンストラクタの中から例外を出すと
デストラクタが呼ばれないから、
常にデストラクタが呼ばれる、という前提でプログラムを書くと
リークしちゃう、とか。
じゃあコンストラクタでは例外送出しなきゃいいんじゃね?と思うと
コピーコンストラクタでのエラーは例外じゃなきゃ拾えないし、とか
どんだけ落とし穴掘ってれば気が済むんだよ。
0223デフォルトの名無しさん
2011/02/20(日) 20:06:42.84C++ プログラマは経験の浅いやつって
前提があるみたいだな
0224デフォルトの名無しさん
2011/02/20(日) 20:11:25.78継承と例外とコンストラクタだ
0225デフォルトの名無しさん
2011/02/20(日) 20:15:33.58C にしろ C++ にしろ、言語のダメな所が認められないプログラマはまずいよな
0226デフォルトの名無しさん
2011/02/20(日) 20:21:31.86それの説明に妙な前提があるのがおかしいんだよ
0227デフォルトの名無しさん
2011/02/20(日) 20:23:05.31「コンストラクタの完了でオブジェクトの構築完了」っていうオブジェクトモデルを把握すれば
自然なことなんだけどね。
FAQ にも載ってる。
http://www.parashift.com/c++-faq/exceptions.html#faq-17.10
日本語で充実した FAQ が無いのが悪いんかな?
0228デフォルトの名無しさん
2011/02/20(日) 20:24:04.23前に挙がっていた例では、C++ を支持している人は C については素人っぽかったよ
0229デフォルトの名無しさん
2011/02/20(日) 20:24:06.05× 相互作用の原因は三つある
○ 俺の良く知らない機能が三つある
0230デフォルトの名無しさん
2011/02/20(日) 20:27:03.07どっちの言語がどうという訳ではないが。
0231デフォルトの名無しさん
2011/02/20(日) 21:26:39.59Cの副作用完了点について知らないなら、
C++で&&とかの演算子オーバーロードが
何故禁じ手か絶対理解できないな。
しかもショートサーキットの概念は特定の言語に
依存しない一般的なものだけど、&&とかがオーバーロードで
副作用の仕方が変わるのは"たまたま"演算子オーバーロードが
関数に変換されるというC++固有の性質だから。
つーか、流石にその程度なら皆正しく使えてるだろ。
未定義動作、特に整数オーバーフローとかCにも難しい罠が
あるのは否定しない。
0232デフォルトの名無しさん
2011/02/20(日) 21:52:40.83単純な原因から複雑な結果が生じているのだから
原因を良く知らないから悪いとか、原因を良く知れば解決するという問題ではない。
0233デフォルトの名無しさん
2011/02/20(日) 21:57:37.750234デフォルトの名無しさん
2011/02/20(日) 22:26:05.05通常書くものが書かれていない場合はコメントを書く。
そういうパターンを整理すれば良いような気がする。
C++には、何も書かなくても自動的に処理する機能が多いが
その機能を使わないから何も書かなかったのか、
使うから何も書かなかったのか分からない。
0235デフォルトの名無しさん
2011/02/20(日) 22:33:36.08> C++には、何も書かなくても自動的に処理する機能が多いが
具体的に。
0236デフォルトの名無しさん
2011/02/21(月) 08:52:00.83フグかよと
0237デフォルトの名無しさん
2011/02/21(月) 09:19:11.05例えば、仮想関数もデフォルト引数も、共にどうってことない
判りやすい概念だが、C++で両方同時に使うと
仮想関数自体は動的型で呼び出し先が決まるのに、
デフォルト引数は静的型で解決される、という
悪意を疑いたくなる罠が存在する。
これも個々は単純だが、結果が複雑な例だな。
0238デフォルトの名無しさん
2011/02/22(火) 12:40:27.23うーん。個人的にはあたりまえに思うんだけど、慣れちゃってるからなんだろうなー。
0239デフォルトの名無しさん
2011/02/22(火) 13:45:14.460240デフォルトの名無しさん
2011/02/22(火) 15:57:22.02デフォルトコピーコンストラクタとデストラクタのコンボとか。
あまりにも有名なトラップなんで、嵌るやつもいないかもしれんが。
0241デフォルトの名無しさん
2011/02/22(火) 21:50:46.99そもそも継承のおかげでアップキャストは当たり前で
例外を使えば型を変更しなくてもエラーに関する仕様を変更できる
型とは一体なんだったのか
0242デフォルトの名無しさん
2011/02/23(水) 00:39:27.54> 例外を使えば型を変更しなくてもエラーに関する仕様を変更できる
これどういうこと?
0243デフォルトの名無しさん
2011/02/23(水) 14:20:18.88デフォルトがユーザ定義型で暗黙的型変換可能って、誰得だよ。
0244デフォルトの名無しさん
2011/02/23(水) 15:13:31.78C++使うのやめようかと思うから困る
0245デフォルトの名無しさん
2011/02/23(水) 15:15:06.01もうC++使ってるんなら手遅れでは
罠が多すぎて習得するのが大変すぎるという話題だからな
0246デフォルトの名無しさん
2011/02/23(水) 15:26:08.43C++0xの右辺値参照が難しすぎて、
俺には理解できる気がしないのだよ。
C++から足を洗ういい機会な気がしてな……
0247デフォルトの名無しさん
2011/02/23(水) 15:31:18.13(うっかり基底クラスの配列に継承クラスを入れてしまいながら)
0248デフォルトの名無しさん
2011/02/23(水) 15:43:06.24そうなるとクラスと例外とテンプレートは使うしなー。
実際、C++の機能で取り除けるものが思い浮かばん。
0249デフォルトの名無しさん
2011/02/23(水) 16:07:54.96"Modern move semantics"とかそんな感じの本が
多分出版されるから、大丈夫だよ!
0250デフォルトの名無しさん
2011/02/23(水) 21:39:37.60一番メリットが無いと思うわ。
Cと比べて特に生産的というわけでもなく、
C++のグロ文法とABI不在の問題点は引き継ぐとか。
どこがbetterなのかと。
0251デフォルトの名無しさん
2011/02/23(水) 22:14:39.960252デフォルトの名無しさん
2011/02/24(木) 03:05:10.83C++ PG B : 「STL 便利じゃん」
C++ PG C : 「クラス便利じゃん」
C++ PG D : 「テンプレート便利じゃん」
C++ PG E : 「例外便利じゃん」
C++ PG F : 「名前空間便利じゃん」
C PG : 「それもう "better" C じゃなくて C++ じゃん・・・」
0253デフォルトの名無しさん
2011/02/24(木) 03:24:42.210254デフォルトの名無しさん
2011/02/24(木) 03:28:05.32C++ 信者 B : 「私は C++ の全てを理解した本物のプログラマだ!」
C++ 信者 C : 「二人のうち少なくとも一人は嘘を付いているな・・・
(C++ の全てを理解出来るのはスッポスッポ先生だけ!)」
0255デフォルトの名無しさん
2011/02/24(木) 08:05:34.530256デフォルトの名無しさん
2011/02/24(木) 09:59:31.63C++イラン。
0257デフォルトの名無しさん
2011/02/24(木) 10:16:57.570258デフォルトの名無しさん
2011/02/24(木) 18:06:32.690259デフォルトの名無しさん
2011/02/24(木) 22:04:07.890260デフォルトの名無しさん
2011/02/24(木) 22:52:35.70頭がハゲると全て理解できます
0261デフォルトの名無しさん
2011/02/24(木) 23:03:43.89C++が酷い言語であることは実例付きで
散々述べられてるけど、Cはそうじゃないだろ?
一緒にされては困る。
0262デフォルトの名無しさん
2011/02/25(金) 01:38:02.39bool 無いとか酷い。仮想関数無いとか酷い。名前空間無いとか酷い。
デストラクタ無いとか酷い。テンプレート無いとか酷い。例外無いとか酷い。
0263デフォルトの名無しさん
2011/02/25(金) 09:15:55.56まったく笑えるほど愚かだな。
0264デフォルトの名無しさん
2011/02/25(金) 09:16:15.59つ <stdbool.h>
0265デフォルトの名無しさん
2011/02/25(金) 22:50:33.74そうじゃない場合はC
を使えばOKってことかな
0266デフォルトの名無しさん
2011/02/26(土) 00:18:21.320267デフォルトの名無しさん
2011/02/26(土) 00:21:23.500268デフォルトの名無しさん
2011/02/26(土) 00:43:42.85C は苦行だと感じないのが不思議
0269デフォルトの名無しさん
2011/02/26(土) 00:54:46.58最初はロートルだのなんだのレッテル張って
抵抗していたが、次々と論破されちゃって
涙目って印象だね。
0270デフォルトの名無しさん
2011/02/26(土) 01:00:39.79世間に抗ってもあんまり意味は無いよね
0271デフォルトの名無しさん
2011/02/26(土) 01:37:05.10↑こんなの論破でもなんでもねだろw
このロートルどもめ。
0272デフォルトの名無しさん
2011/02/26(土) 02:15:23.25それらの言語を実装/拡張するための
「低級言語としての」Cの重要性は全然下がってない。
alternativeが存在しないからな。
一方、C++のCへ追加した機能については、代替手段がいくらでも存在する。
例えばLLならどれを使ってもC++よりは上手くやれる。
つまり「C + 他言語」でC++の代わりは十分勤まる。
それどころか、C++はABI不在、マングリングが腐ってる、
などの理由でCの「低級言語としての」利点を改悪してる。
文法だって罠だらけで腐ってる。
ゆえに他言語と組み合わせて使うなら、C++はCよりも劣る。
さて、ロートルというのは、たぶん新しい言語を覚えたくない人間、
という程度のニュアンスだと思われるが、
果たして本当に新しいものを覚えたくないのはどちらかね?
0273デフォルトの名無しさん
2011/02/26(土) 02:43:13.55> 「低級言語としての」Cの重要性は全然下がってない。
> alternativeが存在しないからな。
低級言語としての C++ は良い alternative
> ゆえに他言語と組み合わせて使うなら、C++はCよりも劣る。
extern "C" すればいっしょですう。
0274デフォルトの名無しさん
2011/02/26(土) 02:43:56.07> 一方、C++のCへ追加した機能については、代替手段がいくらでも存在する。
そりゃそうだが、正直めんどい。
0275デフォルトの名無しさん
2011/02/26(土) 02:55:17.850276デフォルトの名無しさん
2011/02/26(土) 11:10:39.240277デフォルトの名無しさん
2011/02/26(土) 11:23:59.38ABI界面でextern "C"すりゃいいだけなのに何を言ってるんだか俺にはわからねー
C++使いは他の言語使わないみたいな言い草だけど
boost.pythonとか知らないの?
今流行のV8だの、その上で動くnode.jsだの勿論C++で書かれてるし……
現実的には複数言語を使う場合、インタフェース部分のグルーを書く必要があったり
デバッグやリファクタリングが面倒になったりと面倒もあるから
C++一個で済むならそのほうが楽なこともあるよ
ケースバイケースってやつだね
0278デフォルトの名無しさん
2011/02/26(土) 11:43:55.24なんでC使いの人は執拗にC++を叩くんでしょうか?それとも俺が知らないだけで、
C++以外の他の言語も攻撃してるんでしょうか?
0279デフォルトの名無しさん
2011/02/26(土) 12:17:43.820280デフォルトの名無しさん
2011/02/26(土) 12:35:09.70反論できてなくてワロスw
0281デフォルトの名無しさん
2011/02/26(土) 12:40:08.38そこは真実だからしょうがないw
0282デフォルトの名無しさん
2011/02/26(土) 12:45:46.58いかにクソかを書いた記事や本が結構でてたよな。
ttp://web.archive.org/web/20070113222026/http://www.cmagazine.jp/src/kinjite/c/index.html
0283デフォルトの名無しさん
2011/02/26(土) 12:50:07.07そりゃWindowsとMS-DOSどっちを選ぶかみたいなもんだ
WindowsはMS-DOSにくらべりゃ複雑な糞の山だが
それでもみなWindowsを使ってるんだよ
0284デフォルトの名無しさん
2011/02/26(土) 12:55:38.80シンプルなカーネル(C言語)とユーザランド(他言語)ってOSと
何でもカーネルにぶち込む(C++)OSって感じ。
一時期は後者が流行ってたけど(速度的な問題で)
やっぱり保守しやすいのは前者で、最近はそっちに流れてる感じ。
0285デフォルトの名無しさん
2011/02/26(土) 13:04:38.240286デフォルトの名無しさん
2011/02/26(土) 13:18:04.26>>277
0287デフォルトの名無しさん
2011/02/26(土) 14:05:28.36C PG : 「C++ はスマホの主要開発言語に成れなかったからなあ・・・」
C PG : 「サーバサイドは Java に完敗だし・・・」
C PG : 「ウェブアプリは JavaScript の独壇場だし・・・」
C PG : 「デスクトップアプリは C# や Objective-C の時代だし・・・」
C PG : 「そもそもクライアントアプリはウェブアプリ化が進んで行くだろうし・・・」
C PG : 「Kernel プログラミングも殆どが C と ASM だし・・・」
C PG : 「その内、Pascal みたいになって行くのかな・・・」
C++ PG : 「C++ 0x が完成した暁にはッ!」
C PG : 「(うわ、居たのか)200x 年代は終わっちゃったよ?」
0288デフォルトの名無しさん
2011/02/26(土) 14:37:50.870289デフォルトの名無しさん
2011/02/26(土) 14:41:49.060290デフォルトの名無しさん
2011/03/01(火) 17:11:56.75http://local.joelonsoftware.com/wiki/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B
を1000回読むといいよ
0291デフォルトの名無しさん
2011/03/01(火) 20:03:49.190292デフォルトの名無しさん
2011/03/01(火) 20:57:04.560293デフォルトの名無しさん
2011/03/01(火) 21:10:10.35アプリケーションハンガリアンは良いもんだと思ってる人は
ttp://www.maroontress.com/Hungarian/
この辺も読んだほうがいいな
0294デフォルトの名無しさん
2011/03/02(水) 02:12:34.31> 本当に信頼性のあるコードを書く方法は、人の典型的な弱さを考慮に入れるシンプルな
> ツールを使うことであって、副作用のあることや、プログラマの無謬性を前提とする漏れのある
> 抽象化を隠している複雑なツールを使うことではない。
こんなの真面目に考えたら C の最適化コンパイラなんて使えないじゃないんじゃないか?
0295デフォルトの名無しさん
2011/03/02(水) 08:39:51.49普通は各最適化レベルでコードにどんな変更がされるかを把握した上でコンパイラを使うから、
複雑なツールの内には入らないんじゃないの。
0296デフォルトの名無しさん
2011/03/02(水) 09:40:12.55セマンティクスをシンタックス(型システム等)に写像する行為は
完全には上手くいかない(漏れのある抽象化の例)し、
そのリンク先の主張にはとても同意できない。
0297デフォルトの名無しさん
2011/03/02(水) 11:03:06.14そんなんで正当化できるなら「C++ プログラマはデストラクタ呼び出しや例外によるコードパスを
把握した上で C++ を使うから複雑なツールの内には入らない」って言えるってことにならない?
0298デフォルトの名無しさん
2011/03/02(水) 11:11:56.84デストラクタや例外をコンパイラオプションひとつで
付けたり外したりして問題が起こらないというなら、
その主張を認めよう。
0299デフォルトの名無しさん
2011/03/02(水) 11:31:08.71なんで付けたり外したりできることが関係してくるの?
0300デフォルトの名無しさん
2011/03/02(水) 11:45:29.540301デフォルトの名無しさん
2011/03/02(水) 12:04:32.13お前のような信じられないほどの低能には
決して理解できないよ
0302デフォルトの名無しさん
2011/03/02(水) 12:07:31.940303デフォルトの名無しさん
2011/03/02(水) 12:27:27.79すくなくとも、Cの規格の範囲内のことをしている限り、
どんな最適化オプションを付けてもCコンパイラはvalidな
コードを生成する(はず)。
しかし、Cの提供する抽象化にも漏れはあって、
OSカーネルなどのハードウェアに近いプログラムを書くときは、
規格の範囲外のことをする必要が出てくる。
そういうとき、確かに複雑な最適化は思わぬ結果をもたらすことがある
(漏れのある抽象化の例)。
そういうとき、大事なのは漏れのある抽象化にどう対処するか、ということ。
Cコンパイラの場合、単純に最適化レベルを下げる(非常に低コスト)ことで
実現できる。
このように、抽象化が漏れたときに簡単に対処できるかどうかは非常に重要で、
例えば簡単にオンオフできるというのは良いデザインだ。
0304デフォルトの名無しさん
2011/03/02(水) 12:35:07.96ありがとう。
で、 C++ 使って特定の機能が「漏れのある抽象化」など問題を起こすようなら使わなけりゃ
いいわけですよ。 extern "C" で C のコードと混ぜてもいいしアセンブリのコードと混ぜてもいい。
これができるんなら C++ を目の敵にする理由は無いと思うんだけどね。
え?簡単じゃない?
はじめから C で全部書くのに比べたらずっと簡単でしょ。
0305デフォルトの名無しさん
2011/03/02(水) 12:59:13.20C++のどの機能は使ってOKで、どの機能は駄目か、という点について
共通となる文化がない。
例えば、俺が自分でC++を使うときに従うルールは、
多分304のそれとは異なっていて、そのため304が俺のコードを読むときは
例えばオペレータオーバーロードを常に疑わなきゃならないし、
任意の関数から例外が飛んでくる可能性を考慮しなければならない。
俺の従うルールなんて判らないんだから。
これは正直しんどいと思うんだが、どうよ。
俺自身は、使い捨てだがLLより速く走る必要のあるコードを
C++で書くことは良くあって、そういう場合はCより楽なのは確か。
でも、この用途はニッチすぎるだろ。
0306304
2011/03/02(水) 13:20:57.48> これは正直しんどいと思うんだが、どうよ。
C++ ではオペレーターオーバーロードがあって、関数からは例外が飛んでくる。
特に説明の無い限り演算子は組み込み型の定義と類似のものだと読むし、
例外安全を疑うなら変数定義やクラス定義のほうを見て RAII が徹底されているか
確認する。
そういう文化だと認識してるからどうってことない。
> でも、この用途はニッチすぎるだろ。
組み込み機器でLL(?)の類を走らせるのは面倒あるいは不可能。
C++ が最適だよ。
0307デフォルトの名無しさん
2011/03/02(水) 13:33:48.43おいおい、それじゃJoelの言ってるような
副作用の強いC++の機能を使うってことじゃん。
その場合、コードの一部分だけ見ても動作が判らないだろ?
そりゃ読み難いし、「間違ったコードが間違って見える」にも反するよ。
0308デフォルトの名無しさん
2011/03/02(水) 13:44:38.42RAIIを徹底しなければならないのか
それが問題だ
0309デフォルトの名無しさん
2011/03/02(水) 13:44:51.10> その場合、コードの一部分だけ見ても動作が判らないだろ?
> そりゃ読み難いし、「間違ったコードが間違って見える」にも反するよ。
あなたにとってはそうかもしれませんが、僕にとってはそうではないのです。
C のコードだって、どんな言語で書かれたコードだって、そういうのは無くならないでしょ。
読みやすく、間違ったコードが間違って見えるように書くのは、言語じゃなくてプログラマの
責任によるところのほうが大きいんだよ。
0310デフォルトの名無しさん
2011/03/02(水) 14:06:04.15まあ現実的には、ある程度ルールというか空気みたいなものはあるしなあ。
それは会社ごとだったり、開発の規模や種類だったり、
グーグルのコーディングスタイルガイドだったり。
0311デフォルトの名無しさん
2011/03/02(水) 14:24:07.60現場はコンパイラはC++でも
ソースはまんまCのとこばっかじゃん。
なのに「組み込みはC++が最適(キリ」とかwww
0312デフォルトの名無しさん
2011/03/02(水) 15:18:04.500313デフォルトの名無しさん
2011/03/02(水) 16:36:47.53C++で間違ったコードが間違って見えるように書く方法は、
Cの機能だけを使って書くということで、
(なにせ、C++の構文ときたら、実際にやっていることを隠蔽するばかりだからね)
さらにCコンパイラを使うことでC++の忌まわしい機能が
使われていないことをチェックすることができる。
Linusがどっかのメーリングリストで似たようなことを書いてたけど、
なるほど納得だね。
0314デフォルトの名無しさん
2011/03/03(木) 01:12:28.31そりゃそうだ。だって隠蔽するためにあるんだから。
間違ったコードすら埋もれてしまうのも必要悪だと思って、
自分はC++を使っている。
0315デフォルトの名無しさん
2011/03/03(木) 01:29:08.28「現場」といって自分のまわりの状況を紹介してくれるのはいいのですが、
それがどこでも同じだと言える根拠は無いですよね?
0316デフォルトの名無しさん
2011/03/03(木) 01:33:08.14> C++で間違ったコードが間違って見えるように書く方法は、
> Cの機能だけを使って書くということで、
なんで他に方法が無いと思ってるの?
C++以外の言語ではどうなるの?
> Linusがどっかのメーリングリストで似たようなことを書いてたけど、
>>99-101
0317デフォルトの名無しさん
2011/03/03(木) 08:08:25.87C++ PG : 「いやいや。でもそれはお前の個人的な感想、もっと言えば妄想かもしれない
という可能性は完全には排除出来てないんでしょう?」
Kernel PG : 「(また悪魔の証明か)なら、あんたが C++ で書いたら良いんじゃないの、
Linux に匹敵する Kernel をさ。」
0318デフォルトの名無しさん
2011/03/03(木) 08:40:24.730319デフォルトの名無しさん
2011/03/03(木) 10:54:29.59清濁合わせ飲む感じでC++を選択するなら、それはそれで良いんじゃね?
「C++が使える環境でC++を使わない理由などない」とか言っちゃうアホに
反論したくなるだけで、勝手に使う分には好きにすればいいさ。
俺にとってのC++は、書くのはCより楽な場合があるけど、
読むのはCより常に面倒であり、かつ
プログラムは読む時間の方が書く時間よりずっと多いので
可能なら選択したくない言語だけど。
0320デフォルトの名無しさん
2011/03/03(木) 11:32:44.60> なんで他に方法が無いと思ってるの?
ある抽象化を実現する(実際にやっていることを隠蔽する)とき、
(1)抽象化が漏れるシチュエーションを減らす
(2)漏れたときの対処が容易
という二点を満たすのが良いデザインだ。
デザインする、という行為を放棄しているC++は、
当然ながら両方とも満たしていない。
なので、C++を使うときは、Cの機能だけ使うほうがマシなのさ。
0321デフォルトの名無しさん
2011/03/03(木) 11:49:23.74悪魔の証明ってのは言い得て妙だな
バグの存在が客観的に証明されるまではテストもデバッグもしない
自分でバグを探すのは自殺点であり得点にならない思ってる
そういう性格の人もいるんだろうな
0322デフォルトの名無しさん
2011/03/03(木) 11:55:39.85悪魔の証明なんて要らないだろ。言語の特性から結果が導き出せることを示せば良いんだよ。
それをしないで決め付けだけを主張するから突っ込まれる。
0323デフォルトの名無しさん
2011/03/03(木) 11:57:44.71> デザインする、という行為を放棄しているC++は、
こういうのが「決め付け」な。
何が「当然ながら」だよ。わらかすな。
で、 C++ 以外の言語はどうなの?
C++ 以上に裏でいろいろやってくれるけど、全部悪い言語なの?
0324デフォルトの名無しさん
2011/03/03(木) 12:19:41.39裏でいろいろやってる内容をCで表現できれば良い
C++の舞台裏はCで表現できないというか実装依存とされあえて表現していない
0325デフォルトの名無しさん
2011/03/03(木) 12:23:22.52どういうことなの?
他の言語も裏でやることは全部実装依存だろ。
たとえばPythonの例外処理機構とC++の例外処理機構とで、
「Cで表現」できるかどうかが違うの?
0326デフォルトの名無しさん
2011/03/03(木) 12:59:30.63C++以外の言語、といっても色々あるだろうが、
C++ほど抽象化が漏れている言語はそうそう無いだろ。
例えば >>237 の罠なんて、C++が歴史的にCの拡張として実装された、
という文脈をみなければ到底理解できん抽象化の仕方だ。
つまりコンパイラの実装とか、過去の互換性とか、そういう背景を
理解しなければいけないという点で「抽象化が漏れている」。
しかも、それに対する対処方法は「両方同時に使用しない」しかなく、
本当に同時に使用されてないかは対応するコードをチェックしてまわるしかない。
なので「漏れたときの対処が容易」でもない。
で、C++以外の言語だが、少なくとも >>320 の(1)については
C++よりマシだ。C++のような理不尽な罠が少ないからな。
0327デフォルトの名無しさん
2011/03/03(木) 13:06:15.50仕様と実装が分離している言語は嫌われるということ。
その理由の一つは、抽象化が漏れた時に実装が隠蔽されていると困るから。
0328デフォルトの名無しさん
2011/03/03(木) 13:07:13.91例外は「間違ったコードが間違って見えるようにする」の規則には反するが、
ちょっとした書き捨てスクリプトなんかは
「逆に考えるんだ。間違ってもいいと考えるんだ」て感じで
適当に書いてもいい場合があるからな。
そういう意味では、C++でも使い捨てスクリプトなら良いんじゃね?
LLと比べて生産性で勝てるかは疑問だが。
0329デフォルトの名無しさん
2011/03/03(木) 13:27:45.790330デフォルトの名無しさん
2011/03/03(木) 13:50:42.70なるほど。それは正しい主張だと思うよ。
ただ、Cとの互換性も欲しいし「パフォーマンスを損なわずに実装すればそうなるわな」と
思っちゃう自分にとっては、そこらへんは飲めちゃう話なんだよね。
C++に実装された機能と同等のことをCでするために(既存あるいは自前の)ライブラリ郡を
使うのと比べたら、「抽象化の漏れ」についてたいした違いは無いだろう、と。
0331デフォルトの名無しさん
2011/03/03(木) 13:51:49.12↓こちらへどうぞ。
例外を正しく使えないプログラマ多いね。 その6
http://hibari.2ch.net/test/read.cgi/prog/1298059471/
0332デフォルトの名無しさん
2011/03/03(木) 13:54:46.71どう読めばそう取れるんだ?
それに、俺がどんなプログラムを書いてるか解らなくても、
同じような主張をしてるLinusやJoelが
書き捨てスクリプトだけ書いてるわけないくらい解るだろ?
まったくもってアホすぎる。なんて低能なレッテル張りだ。
0333デフォルトの名無しさん
2011/03/03(木) 14:26:24.25抽象化が漏れたときのダメージは、それが(暗黙的な何かを伴うために)
発見しにくいという意味において、はなから抽象化していないよりも深刻だよ。
だからC++と同等のことを(C++のような抽象化を提供しない)Cでしても違いが無い、とは思わん。
ただし、自分が知能に本当に自信があるなら、C++を選んでもいいと思う。
例えば von Neumann が目の前に現れて「C++なんて楽勝www」とか言ったら
「どうぞどうぞ」って言っちゃうよ。
0334デフォルトの名無しさん
2011/03/03(木) 14:34:21.92君は Linus ではない。
0335デフォルトの名無しさん
2011/03/03(木) 14:54:32.80確かに俺はLinusでもJoelでもない。
ここの書き込みに彼らが関係していないのは確実だろう。
しかし、彼らと似たような主張をしており、
そしてそれ以外の情報が与えられていない状況で、
「使い捨てスクリプトだけ書いている」と推論する妥当な理由が存在するのか?
相手を貶めるレッテル張り以外の何物でもないだろ。
0336デフォルトの名無しさん
2011/03/03(木) 18:17:58.960337デフォルトの名無しさん
2011/03/03(木) 18:58:13.200338デフォルトの名無しさん
2011/03/03(木) 19:19:15.32I/O Kit で例外やテンプレート禁止の C++ のサブセットを使ってるだけでしょ
0339デフォルトの名無しさん
2011/03/03(木) 19:23:11.92Cもかなりの罠があるだろとw
ttp://www.amazon.co.jp/dp/4775302558
ttp://www.bugbearr.jp/?C%E8%A8%80%E8%AA%9E%2F%E7%BD%A0
ttp://web.archive.org/web/20070104051347/www.cmagazine.jp/src/kinjite/c/index.html
ttp://www.geocities.co.jp/bleis_tift/cpp/baddefine.html
程度に違いはあるとはいえ、「罠は踏まなきゃ良いだけ」というなら、結局慣れの差じゃないのかい?
0340デフォルトの名無しさん
2011/03/03(木) 19:25:59.98C++さんにはとてもとても敵いませんわ。頑張ってもムリポ。
0341デフォルトの名無しさん
2011/03/03(木) 19:27:41.44思いっきりクラス使ってるけど。http://www.opensource.apple.com/source/xnu/xnu-1228.15.4/iokit/
0342デフォルトの名無しさん
2011/03/03(木) 19:28:06.810343デフォルトの名無しさん
2011/03/03(木) 19:33:10.31一番下のだけ見たけど、そんなのに引っ掛かる様な奴は
どんだけ安全策が施されていたらまともなコードを
書ける様になるんだよw
というかその結論はマジで書いてるの?
0344デフォルトの名無しさん
2011/03/03(木) 19:33:50.62>>338
0345デフォルトの名無しさん
2011/03/03(木) 19:36:51.22逆に聞きたいけどお前の安全の基準はなんなんだよw
Cが絶対的な安全基準なのか?
0346デフォルトの名無しさん
2011/03/03(木) 19:38:22.87質問に質問をw
まずは >>339 の一番下のリンクを読んでくれ。
話はそれからでも遅くないさ。
0347デフォルトの名無しさん
2011/03/03(木) 19:46:36.26CPP を知らない C++ プログラマにとってはその結論は正しいんだろうね。
それを書いた人だって C で #define を使うなとは言わないでしょ。
0348デフォルトの名無しさん
2011/03/03(木) 20:07:27.510349デフォルトの名無しさん
2011/03/03(木) 20:12:07.78そのページだとC++と書いてるが、#defineの危険性や展開時のクセはCでも変わらないだろ。
Cでも複雑にdefineが絡み合ってたら、C++なみにクソなコードになるって。
0350デフォルトの名無しさん
2011/03/03(木) 20:13:00.77一番上は絶版の書籍で、二番目はウィキのメモ書きみたいなノートで、
三番目はリンク先に飛べないから。
つまり、真面目に検討すべき物が提示されていないという事だね。
今これを読んでるから、気が向いたらコメントしてあげよう。
http://literateprogramming.com/ctraps.pdf
0351デフォルトの名無しさん
2011/03/03(木) 20:14:35.80きちんと読んであげないと書いた人が可哀相だぞ。
C++並みのコードを書くには何百個 #define すれば良いのやら見当もつかないわ・・・
0352デフォルトの名無しさん
2011/03/03(木) 20:23:50.53生え際が消滅する呪いが掛かるってばっちゃが言ってた。
0353デフォルトの名無しさん
2011/03/03(木) 20:34:49.68・マクロであることを意識して展開時にどうなるかを考えなければならない(Cのその他の構文から考えると例外的)
・エラー時に分かりにくい
どちらもC++のテンプレートを叩くときの常套句と重なる気がするんだが。
0354デフォルトの名無しさん
2011/03/03(木) 20:39:38.83言語の中での位置付けを無視すればどんな拡大解釈だって可能さ。
君だって本当に CPP とテンプレートの問題が同レベルだとは思ってないんだろう?
CPP の用途はシンプルな置換が殆どなんだから、テンプレートと一緒にするのは
ちょっと理解出来ない。
0355デフォルトの名無しさん
2011/03/03(木) 20:41:43.59確かに拡大ぎみだとは思うが、知らなければ落とし穴になりうる物なのは確かだと思うんだろ?
0356デフォルトの名無しさん
2011/03/03(木) 20:49:48.38拡大気味なんじゃなくて無理筋を攻めてる感じがするね。
0357デフォルトの名無しさん
2011/03/03(木) 21:17:41.23CでできることをするときにはC++でやった方が罠が小さいのは同意するよね。
0358デフォルトの名無しさん
2011/03/03(木) 21:28:00.08結婚はしたくないタイプ。
0359デフォルトの名無しさん
2011/03/03(木) 21:30:16.290360デフォルトの名無しさん
2011/03/03(木) 21:34:27.87何か色々と残念だなあと思う事はあるけど
0361デフォルトの名無しさん
2011/03/03(木) 21:53:37.780362デフォルトの名無しさん
2011/03/03(木) 22:58:22.66Linusの主張(>>99)で唯一根拠が無いのが
「C++は多くの平均以下のプログラマが使っている」
って点だが、それすらも >>339 の反論の
あまりのヘボさによって例示されてしまっている。
0363デフォルトの名無しさん
2011/03/03(木) 23:13:16.690364デフォルトの名無しさん
2011/03/03(木) 23:13:57.820365339
2011/03/03(木) 23:30:28.78自分はプログラマでは無い。
だから適切なコードの例示すことはできないが、
339で言いたかったのは、そういう本なり記事なりがあるくらい
なんだから、Cにもクソ差は充分盛り込まれてるんだろうということ。
違うというなら俺よりも著者にお便りでも書いてください。
0366デフォルトの名無しさん
2011/03/03(木) 23:33:35.390367デフォルトの名無しさん
2011/03/03(木) 23:35:14.04良い例が書けないだけで。
0368デフォルトの名無しさん
2011/03/03(木) 23:39:03.71サンプルコードも書けないし、文献も見つけて来れない奴が、
何であれプログラミング言語をクソ呼ばわり出来るんだ?
0369デフォルトの名無しさん
2011/03/03(木) 23:39:59.43何であれ → 何で
0370デフォルトの名無しさん
2011/03/03(木) 23:40:51.32そういうロジックでいうなら、
紹介してくれたCの本が絶版になってる一方、
Effective C++が必読本&ベストセラーとなってる点で
察してくださいよ。
0371デフォルトの名無しさん
2011/03/03(木) 23:41:24.150372デフォルトの名無しさん
2011/03/03(木) 23:42:00.46そういうロジックでいうなら、
紹介してくれたCの本が絶版になってる一方、
Effective C++が必読本&ベストセラーとなってる点で
察してくださいよ。
0373372
2011/03/03(木) 23:44:07.540374デフォルトの名無しさん
2011/03/03(木) 23:45:47.120375デフォルトの名無しさん
2011/03/03(木) 23:46:29.070376デフォルトの名無しさん
2011/03/03(木) 23:51:15.05・絶版の書籍
・ウィキのメモ書き
・大半が C 以外の言語にも当て嵌まるコーディング上で避けるべき点のリスト
・C++ の罠
これで彼は何を主張したかったんだろうか・・・
0377デフォルトの名無しさん
2011/03/03(木) 23:51:56.02そりゃ新規でCだけ覚えるヤツがいないからじゃねーの?
0378デフォルトの名無しさん
2011/03/03(木) 23:54:12.410379デフォルトの名無しさん
2011/03/03(木) 23:56:11.13CのバイブルK&Rを無視すんな。
Cの本=絶版じゃねーよ。
0380デフォルトの名無しさん
2011/03/03(木) 23:57:44.780381デフォルトの名無しさん
2011/03/03(木) 23:59:09.630382デフォルトの名無しさん
2011/03/03(木) 23:59:44.80ちゃんと文章を読んであげなよ
0383デフォルトの名無しさん
2011/03/04(金) 00:04:08.74MAXマクロが引数を二回評価しうるて話やろ
C++だとそもそもマクロ使わないけど、Cだとねえ
0384デフォルトの名無しさん
2011/03/04(金) 00:04:43.933項演算子の?と組み合わせてる例以外はCの罠に見えるが
0385デフォルトの名無しさん
2011/03/04(金) 00:07:33.76>>339どこをどう読んだらそうなるんだよ・・・
しかも、それだってgets()の話と一緒だろ。
Cプログラマには常識レベルの話で騒いでるだけ。
0386デフォルトの名無しさん
2011/03/04(金) 00:08:43.02C++の例だってC++PGには常識なんじゃないの?
0387デフォルトの名無しさん
2011/03/04(金) 00:09:10.15それはCPPを知らない事が前提だろ。筋立てが無理矢理すぎるんだよ。
0388デフォルトの名無しさん
2011/03/04(金) 00:10:30.21常識の範疇で収まるなら云い訳がましい書籍が何冊も出ないだろうさw
0389デフォルトの名無しさん
2011/03/04(金) 00:17:06.53問題は、名前のない暗黙の罠をどうやって検索するか
0390デフォルトの名無しさん
2011/03/04(金) 00:24:12.95?
0391デフォルトの名無しさん
2011/03/04(金) 00:27:41.10>339で言いたかったのは、そういう本なり記事なりがあるくらい
結局の所、選んだリンクがマズかったな。
0392デフォルトの名無しさん
2011/03/04(金) 01:20:04.84CでもC++で抽象化されているものと同様のことをしようと思ったらライブラリレベルで抽象化を行うでしょ。
そうしたら同じように気をつける以外避けようの無い抽象化の漏れも出てくるでしょ、って話。
0393デフォルトの名無しさん
2011/03/04(金) 08:42:32.22何か例を挙げてみてくれるか?そうすると話がしやすい。
で、俺が最初に思いついたのは、シグナルとスレッドが両方絡むような
プログラムで、これは確かに罠満載で難しんだけど、
ある意味で「本当に難しいことをしようとしてる」から難しいんであって、
C++の提供する抽象化のように、面倒くさがらずに
明示的に書けば難しくない例(例外の代わりにエラーコードを明示的に書くとか)
と一緒にしたくないな。
0395デフォルトの名無しさん
2011/03/04(金) 09:45:29.94C++がdisられる → 脊髄反射で質問 → さらにdisられる → C++だけじゃなくCも糞と言い出す → 一緒にすんな → 最初に戻る
のループはちょっと面白いな
0396デフォルトの名無しさん
2011/03/04(金) 10:12:07.48プロセスとスレッドが両方絡むのは、.NETとC++が両方絡むようなもの。
C++プログラマでもC++/CLIを素直に受け入れる者は少ない。
しかし敵の敵は味方だというし
C++をdisるくらいならC++/CLIをほめちぎるほうが前向きだ。
0397デフォルトの名無しさん
2011/03/04(金) 11:48:29.87ごめんそれ例外が難しいんじゃなくて393に例外が難しいだけにしか見えない
0398デフォルトの名無しさん
2011/03/04(金) 11:50:18.56解放忘れとか?
0399デフォルトの名無しさん
2011/03/04(金) 13:42:38.31確かに俺にとって例外は難しい。
しかしお前にも、例外を使ったマズいコードと、
例外安全な良いコードを簡単に見分けることなどできないはずだ。
http://blogs.msdn.com/b/oldnewthing/archive/2005/01/14/352949.aspx
シグナルとスレッドが(内容を完全に理解していてさえ)難しいのと同様、
複数のコードパスを(暗黙的に)生成してしまうコードが
難しくないわけがない。
これは言語仕様を理解できるか否かの問題じゃなく、
人間の認知機能の問題だからな。
0400デフォルトの名無しさん
2011/03/04(金) 14:04:26.27例えば、mutexでロックして処理を実行していて(処理が終わればアンロックする)
途中で非同期シグナルで割り込まれた場合とか。
割り込まれた場合、即座に処理を中断することが望まれるけど、
mutexを握ったまま中断されるとデッドロックしてしまう。
(なので、シグナルハンドラから安易にpthread_cond_signalとかを送っちゃヤバい)
かといって、のんびりアンロックするまで処理を中断しないのも困る。みたいな。
0401デフォルトの名無しさん
2011/03/04(金) 14:18:36.45C だって goto は使えるけど、無茶な使い方はしないでしょ。
goto と例外を直接比べてるわけじゃないよ。念のため。
0402400
2011/03/04(金) 14:21:19.51上の例とはちょっと合ってない。
0403デフォルトの名無しさん
2011/03/04(金) 17:26:48.51GC頼みのRAII守らんコードなんてC++で例外使うなら即ゴミ箱行きじゃ
PGごと窓から投げ捨ててしまえ
0404デフォルトの名無しさん
2011/03/04(金) 18:24:43.35例外は書くのが難しいんじゃないんだ。
読むのが(そして、どのコードをゴミ箱に突っ込むべきか)を読み解くのが面倒なんだよ。
なに?例外安全で無いコードを書くやつなんていない?
人間は基本的にミスするものだし、何より >>339 を読んで
「Cにも罠がある!」とか言っちゃうような底なしの低能どもが
Exceptional C++ に書いてあるような内容をミス無く実行できるはずもないだろ?
0405デフォルトの名無しさん
2011/03/04(金) 18:43:57.760406デフォルトの名無しさん
2011/03/04(金) 18:46:29.55ヨハネスブルグより安全なら大丈夫ってか?
0407デフォルトの名無しさん
2011/03/04(金) 19:05:21.98スレタイにある通り、最悪とだけ比較します
0408デフォルトの名無しさん
2011/03/04(金) 22:55:51.78> しかしお前にも、例外を使ったマズいコードと、
> 例外安全な良いコードを簡単に見分けることなどできないはずだ。
>
> http://blogs.msdn.com/b/oldnewthing/archive/2005/01/14/352949.aspx
リンク先の記事が言っているのは良いコードと悪いコードの見分けではないよ。
Raymond Chen からの最後のコメントにこうある。
> My point is not that it's easier/harder to find mistakes in
> error-based or exception-based code. It's that it's harder to
> **tell the difference** between code where the author thought
> about errors/exceptions and code where the author didn't.
書いた人が処理の失敗をちゃんと意識しているかどうかをコードを見て
判別するのが例外を使った場合はより難しくなる、と言っている。
ただし、これについても疑問の余地が残る。
処理の完了前に副作用を起こしてしまうようなコードを修正するには処理順を
入れ替えるだけだったり、途中の値をローカル変数を使って保留させたり
するんだけど、これは例外を使った場合でも戻り値を使った場合でも同様
だからね。
0409デフォルトの名無しさん
2011/03/04(金) 23:06:44.31> 複数のコードパスを(暗黙的に)生成してしまうコードが
> 難しくないわけがない。
> これは言語仕様を理解できるか否かの問題じゃなく、
> 人間の認知機能の問題だからな。
人間にとって扱うのが難しいほどの数のコードパスを生み出しているのは
使用する処理が持つ失敗の可能性であって、通知〜処理方法として例外を選択
したことでそれが増えるわけではない。
通知〜処理方法に戻り値+明示的なテストを選択した場合、プログラマの手抜き
などによって本来分かれるべきだったコードパスが暗黙のうちに合流してしまう
ことがある。
例外を批判するプログラマは、しばしばこの暗黙の合流に慣れており、
例外安全の文脈で示される本来あるべきコードパスの数を見て、それを例外が
引き起こす問題だと勘違いしている。
例外が暗黙のうちにコードパスを分けるのに比べて、戻り値を使った場合の
暗黙のコードパスの合流は多くの場合に間違いとなる。この点で例外のほうが
優れており、それゆえに C 以外の言語には多く採用されていて、実際に利用
されている。
0410デフォルトの名無しさん
2011/03/04(金) 23:10:04.33例外にまつわる誤解について、参考リンク。
http://www.boost.org/community/exception_safety.html
> 2 Myths and Superstitions
...
> It's almost as though exceptions are viewed as a mysterious attack on
> otherwise correct code, from which we must protect ourselves.
...
> "Exceptions make it more difficult to reason about a program's behavior." ...
これが書かれたのがもう10年前のこと。いい加減にこんな迷信は消えて欲しい
ほしいところなんだけど、まだまだみたいだね。
もうひとつおまけ。
http://www.parashift.com/c++-faq/exceptions.html#faq-17.1
[17.1] What are some ways try / catch / throw can improve software quality?
> By eliminating one of the reasons for if statements.
...
0411デフォルトの名無しさん
2011/03/05(土) 09:50:54.34Raymond Chen はコメント欄で色々突っ込まれたあげく、
最後に「例外はミスを見つけるのが難しいんじゃないんだからね!
コード作者の意図が読みづらいだけなんだからね!」
って意見をちょっと変更しているように見える。
ま、それはいいんだけど。
0412デフォルトの名無しさん
2011/03/05(土) 10:04:16.630413デフォルトの名無しさん
2011/03/05(土) 10:04:45.22ここではずっと、「読むのが難しい」という話をしてたつもりだった。
なぜ読むのが難しいかと言えば、
例外が throw するコードと catch するコードが同じ画面にあることは
滅多に無く(どこか関数の深いところから飛んでくる)、
しかも = やら + といったオペレータからさえ飛んでくる上に、
変数の型をチェックして型を実装したコードを見つける必要があり、
さらに継承が使われてたらクラス階層をたどる必要があり、
ポリモーフィズムが使われてたら実行時における型が何かを知る必要があり、
すなわちどこからどんな例外が飛んでくるか知るのに
コードの様々な部分を読まなきゃならない。
これが、高々(オーバーロードさえない)関数の戻り値を調べてるコードを読むより
読みやすいというなら、あんたは大嘘つきだ。
0414デフォルトの名無しさん
2011/03/05(土) 10:09:32.98危険な言語であるCに、さらに罠を大量に追加して
「自分の足を撃つなら、撃つやつが悪い」って突き放してるんだぜ。C++は。
Cの危険さは必要悪だが、C++が容易する便利機能は他の言語で
もっと安全に実装されてるんだから、
そっち使ったほうがいいよ。
0415デフォルトの名無しさん
2011/03/05(土) 10:35:05.71次のコードブロックは、例外ベースの正しいコードと間違ったコードを
それぞれ表しています(実際に使われてるコードから抜粋した、らしい)。
(1)
NotifyIcon CreateNotifyIcon()
{
NotifyIcon icon = new NotifyIcon();
icon.Text = "Blah blah blah";
icon.Visible = true;
icon.Icon = new Icon(GetType(), "cool.ico");
return icon;
}
(2)
NotifyIcon CreateNotifyIcon()
{
NotifyIcon icon = new NotifyIcon();
icon.Text = "Blah blah blah";
icon.Icon = new Icon(GetType(), "cool.ico");
icon.Visible = true;
return icon;
}
これはヒドいwww
0416デフォルトの名無しさん
2011/03/05(土) 10:43:13.75> 例外が暗黙のうちにコードパスを分けるのに比べて、戻り値を使った場合の
> 暗黙のコードパスの合流は多くの場合に間違いとなる。
何か例をあげてみてよ。
多くの場合に間違いとなるなら、簡単でしょ?
0417デフォルトの名無しさん
2011/03/05(土) 12:37:37.23これもコードパスがどこからか合流していることを意味する。
おそらく、同じ「型」の例外ならば合流して良いということにしたいんだろうが
例外のコードパスはグローバルすぎてどうしようもない。
「型」のことしか考えないから、スコープの感覚が退化してるんだろう。
0418デフォルトの名無しさん
2011/03/05(土) 12:46:50.64int ret;
if(( ret = foo() ) != FOO_OK ){
return ret;
}
if(( ret = bar() ) != BAR_OK ){
return ret;
}
if(( ret = baz() ) != BAZ_OK ){
return ret;
}
return HOGE_OK;
}
int caos::Panic::Confusion::Hoge() throw(...){
try{
caos::foo();
caos::bar();
caos::baz();
return caos::Panic::Confusion::hogeReturn_t::HOGE_OK;
}
catch(caos::Foo_Exception &e){ throw caos::Panic::Confusion::hogeException(e); }
catch(caos::Bar_Exception &e){ throw caos::Panic::Confusion::hogeException(e); }
catch(caos::Baz_Exception &e){ throw caos::Panic::Confusion::hogeException(e); }
catch(...){ assert(0);caos::Panic::Confusion::hogeException("UnknownError"); }
}
どっちがわかりやすいかなんて、明らかだろ
0419デフォルトの名無しさん
2011/03/05(土) 13:05:18.69pure C++ vs C/C++で後者にしたほうがいい例を知りたいです。
過去の投稿(↑)はこれから読みます。
=============
普段からpure C++(およびC++0x)しか使ってなくて、困ったことはないのですが、
C言語のほうが短く簡単に書けるようなことってたぶん結構あるんじゃないかと思うのです。
思いつくのを羅列してみると、
- I/O関係(printf,scanf,...)
- マクロ
- 配列初期化
- ポインタ演算
C++0xでかなり改善されているとはいえ(autoとか)、対応するコンパイラがマシンに入ってない場合も多いので、
ちょっとC言語も勉強してみようと思うのですが、みなさんが普段dirtyテクニックとしてCを混在させているものを教えてください。
0420デフォルトの名無しさん
2011/03/05(土) 13:13:31.49そんな質問でこのスレに誘導するなんて鬼畜すぎるwww
http://hibari.2ch.net/test/read.cgi/tech/1296387672/
http://hibari.2ch.net/test/read.cgi/tech/1291571263/
この辺で質問した方が良いよ。
0421419
2011/03/05(土) 13:18:33.29いや、普段0xスレしか見てないので、そこに書き込んだのですが、
たしかに、雑談チックな話をはじめる雰囲気でもなかったので・・・。
気軽に答えてくださればありがたいです。
0422デフォルトの名無しさん
2011/03/05(土) 16:59:42.91だから使わないってのは極論すぎるような。
使い捨てスクリプト的なプログラムみたいに
それで済む仕事ならいいだろうけど。
0423デフォルトの名無しさん
2011/03/05(土) 18:40:52.91確かに、今すぐ結論を出す必要はない。
Cで書きはじめて途中でC++に変更できる。
逆はできない。
0424デフォルトの名無しさん
2011/03/05(土) 18:46:05.22オチは見えてるなぁ。
0425デフォルトの名無しさん
2011/03/05(土) 18:57:55.47まともに設計されたモジュールは、実装言語すら情報隠蔽できるのだよ
0426デフォルトの名無しさん
2011/03/05(土) 18:59:56.20C++固有のモジュールシステムは使えない
0427デフォルトの名無しさん
2011/03/05(土) 19:16:15.20Cで書きはじめるなら、
それはC++に変更する意味ないよ。
0428デフォルトの名無しさん
2011/03/05(土) 19:28:27.74> 変数の型をチェックして型を実装したコードを見つける必要があり、
> さらに継承が使われてたらクラス階層をたどる必要があり、
> ポリモーフィズムが使われてたら実行時における型が何かを知る必要があり、
なんのためにそんな実装しだいでどうにでも変わる情報を知る必要があるの?
それは戻り値でのエラー通知でもわからないはずなんだけど、何が違うの?
> これが、高々(オーバーロードさえない)関数の戻り値を調べてるコードを読むより
> 読みやすいというなら、あんたは大嘘つきだ。
あんたの言うような読み方しない。しないでいいと思っている。
そこらじゅうに if が散らばったコードより処理の元々の意図が読みやすいぶん
戻り値+分岐を使ったコードより簡単だと思う。
0429デフォルトの名無しさん
2011/03/05(土) 19:30:37.03array = realloc(array, size);
こんなのとか。
0430デフォルトの名無しさん
2011/03/05(土) 19:33:54.80例外が発生した場合のコードパスは、暗黙のうちに一本に合流しようとする。
これは明示的に catch を書くことででいくつかに分けることができる。
> おそらく、同じ「型」の例外ならば合流して良いということにしたいんだろうが
> 例外のコードパスはグローバルすぎてどうしようもない。
ここの2行目がよくわからない。何に困ってるの?
0431デフォルトの名無しさん
2011/03/05(土) 19:40:34.13そこはどうしてるわけ?
0432デフォルトの名無しさん
2011/03/05(土) 19:46:28.82その例外型の変換は必要なの?(戻り値のほうでは変換はしてないようだけど・・・)
http://www.google.co.jp/search?q="Organizing+the+exception+classes+around+the+physical+thrower"
0433デフォルトの名無しさん
2011/03/05(土) 20:00:14.48だれがそんな糞コード書くか
0434デフォルトの名無しさん
2011/03/05(土) 20:02:28.10http://www.google.com/codesearch?q=lang:c+%22=+realloc%22
0435デフォルトの名無しさん
2011/03/05(土) 20:04:04.25setjmp/lognjmp はCでも非常に危険なので、それを使わなければ
実現できない場合以外は使われない。
C++では、単純に使うことすら危険すぎる。
0436デフォルトの名無しさん
2011/03/05(土) 20:09:39.19そういうプロジェクトも少なくない。
コンパイラによってはオプションまである。
0437デフォルトの名無しさん
2011/03/05(土) 20:09:39.41例外だって積極的には使われないという認識なんだけど。
統計でどうかとかは分からない、イメージ論でしかないが。
少なくても自分の場合は復帰不可能な場合でしかまず使わない。
0438デフォルトの名無しさん
2011/03/05(土) 20:11:46.26C++ が酷いのは同意なんだがw
0439デフォルトの名無しさん
2011/03/05(土) 20:12:50.81何でもかんでも例外で返すやつがいるのかよと。
0440デフォルトの名無しさん
2011/03/05(土) 20:16:43.51「例外は例外的な場面でだけ使う」とかいうやつか。
そんな基準は主観的なものになってしまって役に立たないよ。
http://www.boost.org/community/error_handling.html
> The problem is that one person's ``exceptional'' is another's ``expected'':
> when you really look at the terms carefully, the distinction evaporates and
> you're left with no guideline.
コンストラクタの失敗ならどんな些細な理由でも例外で返す他無い。
0441デフォルトの名無しさん
2011/03/05(土) 20:18:41.83それはほとんど復帰不可能なケースなんじゃないの?
Cならexitするような。
0442デフォルトの名無しさん
2011/03/05(土) 20:20:55.570443デフォルトの名無しさん
2011/03/05(土) 20:26:52.46その手の復帰不可能な例外ならmainで一括して拾うか、処理系によっては
拾う必要すらなかったりすると思うんだけど。
0444デフォルトの名無しさん
2011/03/05(土) 20:28:32.390445デフォルトの名無しさん
2011/03/05(土) 20:34:20.66という前提条件なんじゃないの。
投げられても拾う必要がないなら除外されるだろ。
0446デフォルトの名無しさん
2011/03/05(土) 20:36:19.68それが問題になるのは用途だろ。どういう用途で使うか考えずになんで議論できるのか。
0447デフォルトの名無しさん
2011/03/05(土) 20:37:34.710448デフォルトの名無しさん
2011/03/05(土) 20:39:21.120449デフォルトの名無しさん
2011/03/05(土) 20:41:04.180450デフォルトの名無しさん
2011/03/05(土) 20:48:41.34例外の場合、その関数を呼び出す側に暗黙的にコードパスを追加できるから、
実装しだいでどうにでも変わるとか言ってられないよ。
っていうか、「僕はいいかげんにコード読んでます」とか自己紹介いらないから。
0451デフォルトの名無しさん
2011/03/05(土) 20:54:54.38realloc すらまともに扱えないプログラマが、C++ になったら
まともなプログラムを書けるなんてとても思えない。
素直に C/C++ じゃなく python あたり使ってほしい。
0452デフォルトの名無しさん
2011/03/05(土) 20:58:57.94例外を投げない関数が例外を投げるようになったときの話か?
戻り値にエラーを含まなかった関数が含むようになったときと同じじゃないか?
エラーが無視されないぶん例外のほうがマシじゃないか?
0453デフォルトの名無しさん
2011/03/05(土) 20:59:15.11mallocに失敗するときは殆ど復帰不可能だから、
エラーチェックなんていらないよなwww
0454デフォルトの名無しさん
2011/03/05(土) 21:00:19.29誰もそんなこと瑣末な主張はしていない。 >>416 の望んだとおりの例を挙げただけだろ。
ちゃんとアンカーついてるんだからレス辿れよ。
0455デフォルトの名無しさん
2011/03/05(土) 21:02:58.44勝手に糞コード書いといて、問題起きますよねってアホか。
だいたい、どこが暗黙のコードパスの合流なんだよ。見え見えじゃねーか。
0456デフォルトの名無しさん
2011/03/05(土) 21:04:03.02戻り値+分岐だとどう違うのかよく考えてからにしろよ。
0457デフォルトの名無しさん
2011/03/05(土) 21:05:43.41いや、もっと単純に、コードを追跡するのが面倒って主張に対し、
そもそも追跡なんてしないって返されたから、
そりゃやべーでしょって話。
0458デフォルトの名無しさん
2011/03/05(土) 21:08:07.15だったら何のために実装にもぐって追跡なんてするのか教えてくれ。
戻り値でエラー通知されたときにはそれが不要になる理由がわかるようにな。
0459457
2011/03/05(土) 21:10:07.19(または、時には関数定義の戻り値の型を調べるだけで)
エラーが追加されたか判るけど、
例外の場合、どこまでも遡る必要がある。
0460457
2011/03/05(土) 21:13:19.26戻り値を処理してなければ、単純にバグを疑うことができる。
一方、例外の場合、catch していないときでも
もっと上のルートで例外処理しているのかもしれず、
バグかどうかの判定にはずっと多くのコードを読む必要がある。
0461デフォルトの名無しさん
2011/03/05(土) 21:13:22.39バカか?
exitするかどうかの為にチェックするんだろ
0462デフォルトの名無しさん
2011/03/05(土) 21:14:59.39お前さんのデバッガには例外時に潜れる機能も付いてないのか?
0463デフォルトの名無しさん
2011/03/05(土) 21:15:32.63冗談に噛み付かれてちょっとビックリ。
しかし真面目な話、exitさえまともにできないときあるよな。
0464デフォルトの名無しさん
2011/03/05(土) 21:17:52.08あまりにセンス無い文だったので冗談だと分かんないからな。
どこら辺がどういう意味の冗談になってるの?
0465デフォルトの名無しさん
2011/03/05(土) 21:18:07.92なんで戻り値の場合は仕様(ドキュメント)が更新されるのが前提なのに
例外だと仕様が更新されないのが前提なの?おかしいだろ?
0466デフォルトの名無しさん
2011/03/05(土) 21:18:12.55実装に潜って追跡する必要が無い、って主張が無理筋だとわかったから
デバッガ使って読みますよ、に変えたんだよね?
0467デフォルトの名無しさん
2011/03/05(土) 21:21:18.08catch してなかったらバグで catch してたらバグじゃない、とか思ってるの?
それ違う。(むしろ逆のことのほうが多い)
実際は、例外使えば「戻り値を処理していない」というような、バグを疑うパターンが
減るってことだろ。いいことじゃないか。
0468デフォルトの名無しさん
2011/03/05(土) 21:22:46.43441が自分で勝手に復帰不可能なエラーか否かを決めてるからさ。
そんなこというなら、malloc失敗はもうOSがクラッシュしてて何しても無駄、とか
なんとでも言えるだろ?
で、お前は例外の痛いところを突かれて、どうでもいいところに噛み付いてるんだよねw
0469デフォルトの名無しさん
2011/03/05(土) 21:24:39.74デバッガ使いこなせてないからってそれはないだろ
0470デフォルトの名無しさん
2011/03/05(土) 21:26:05.80> catch してなかったらバグで catch してたらバグじゃない、とか思ってるの?
> それ違う。(むしろ逆のことのほうが多い)
どういうこと?
0471デフォルトの名無しさん
2011/03/05(土) 21:27:06.30属性throw()もコメント//never throwも使わない人?
0472デフォルトの名無しさん
2011/03/05(土) 21:30:13.78少なくとも C++ の場合、リソース解放やのために catch しているケースでは
RAII で置き換えたほうがよいことが多い。 catch してリソース解放している箇所が
あれば、似たような別の処理で同じようにする必要があり、漏れる可能性が残る。
0473デフォルトの名無しさん
2011/03/05(土) 21:34:50.58例外で投げれる型の制限について、コンパイル時に
チェックしてくれたら良かったのに、とは思うよ。
0474デフォルトの名無しさん
2011/03/05(土) 21:35:32.26それを言うならお前の方が例外なんて使う必要が無いケースで軽々しく例外飛ばしてると
勝手に考えてるんじゃないの?
0475デフォルトの名無しさん
2011/03/05(土) 21:36:41.26エラー処理 = リソース解放、ならそうかもね。
でもデストラクタで可能なエラー処理なんて、たかが知れてると思うの(例外投げれないからな)
0476デフォルトの名無しさん
2011/03/05(土) 21:37:38.99throwしたらバグ
exitしたらバグじゃない
だからthrowするよりexitする方がいい
0477デフォルトの名無しさん
2011/03/05(土) 21:39:56.83大抵そうだと思うが、可能な限りデストラクタ呼んで欲しい場合はthrowの方がいいんじゃない?
0478デフォルトの名無しさん
2011/03/05(土) 21:40:45.65例外を必要十分なだけ使ってる良いコードと、
なんでもかんでも例外をとばしてる糞コードとが
コードを詳細に追跡すること無く、容易に判定できたらいいのにね。
0479デフォルトの名無しさん
2011/03/05(土) 21:40:54.22そうか。分野によっては catch にエラー処理を書くことは多いのかもしれないな。
個人的な経験の話になっちゃうみたいなんで、「逆のことのほうが多い」は無視して。
0480デフォルトの名無しさん
2011/03/05(土) 21:42:30.820481デフォルトの名無しさん
2011/03/05(土) 21:46:15.23別に、お前らを攻撃してる訳じゃないからね。
C++をちゃんと使いこなしてるなら、それはそれで立派なことだから。
0482デフォルトの名無しさん
2011/03/05(土) 21:59:10.52お前らいいかげんにしてください。
人間、皆がお前らみたいに賢くないんです。マジで。
0483デフォルトの名無しさん
2011/03/05(土) 22:03:44.73・仕様を読む
・throwで検索して何を投げてるのか見る
これだけでも見分けられるかもしれない。
0484デフォルトの名無しさん
2011/03/05(土) 22:11:55.58C++委員会の方々も必要な機能を必要な人だけが使ったらえぇ
と、おっしゃってたからなぁ。
0485デフォルトの名無しさん
2011/03/05(土) 22:25:50.64#define NO_TEMPLATE
#define NO_EXCEPTION
#define NO_NAMESPACE
#define NO_INHERITANCE
#define NO_OPERATOR_OVERLOAD
みたいなので全部無効に出来てたらそこそこいい言語になるのになあ
0486デフォルトの名無しさん
2011/03/05(土) 22:30:17.360487デフォルトの名無しさん
2011/03/05(土) 22:32:47.51委員会はそんなこと言うならちゃんと取り外せるように作れと
0488デフォルトの名無しさん
2011/03/05(土) 22:33:18.650489デフォルトの名無しさん
2011/03/05(土) 22:34:27.910490デフォルトの名無しさん
2011/03/05(土) 22:50:02.06コンストラクタ使わない書き方が普及したらC++使ってもいい。
0491デフォルトの名無しさん
2011/03/05(土) 22:53:07.91コンストラクタで例外を何に使ってるの?
0492デフォルトの名無しさん
2011/03/05(土) 22:56:11.990493デフォルトの名無しさん
2011/03/05(土) 22:57:15.820494デフォルトの名無しさん
2011/03/05(土) 23:00:59.92戻り値受け取る自然な構文がないのはわかるけど、もうこんなんでいいから取れるようにしてくれ
Hoge h(42);
int ret = return<Hoge>;
0495デフォルトの名無しさん
2011/03/05(土) 23:02:40.170496デフォルトの名無しさん
2011/03/05(土) 23:03:30.82例外をOFFにした場合の話なので、コンストラクタの中でもOFFです
0497デフォルトの名無しさん
2011/03/05(土) 23:04:18.22何がご不満?
0498デフォルトの名無しさん
2011/03/05(土) 23:06:36.600499デフォルトの名無しさん
2011/03/05(土) 23:10:56.91Hoge(int n, int *ret){
if(なんかエラー){
*ret=1;
return;
}
*ret=0;
}
int ret;
Hoge h(42, &ret);
if(*ret){
return ERROR;
}
なんで今まで気付かなかったんだろう
というかコンストラクタのエラー対処法の議論ってそこらに議論転がってるけど
今までこれ見たことないな
0500デフォルトの名無しさん
2011/03/05(土) 23:25:36.200501デフォルトの名無しさん
2011/03/05(土) 23:37:33.260502デフォルトの名無しさん
2011/03/05(土) 23:41:43.56言語仕様でいうと正当なコードだろうけど
ものすごい挑発的に見えるから、大人しくCを使うのがよさそう
0503デフォルトの名無しさん
2011/03/06(日) 01:52:08.99コピーコンストラクタ
0504デフォルトの名無しさん
2011/03/06(日) 01:54:10.57例外使うのがモダンなコーディングスタイルかというと、
それも疑問。
グーグルのC++コーディング規約は例外を禁止してるだけでなく、
go言語は仕様から例外を外してる(戻り値でのエラー通知を採用)。
0505デフォルトの名無しさん
2011/03/06(日) 02:04:50.86google のスタイルがモダンじゃない
というだけの話だろ。
0506デフォルトの名無しさん
2011/03/06(日) 02:07:34.49C++だと、名前空間、オーバーロード、ポリモーフィズムがあるから
あるメソッドが例外送出するように仕様変更になったとして、
じゃあどこを直せば良いのか、簡単には判らなくないか?
特にオペレータが変更されたとき。
一方、Cならgrepで一発。
0507デフォルトの名無しさん
2011/03/06(日) 02:09:52.82グーグルよりモダンな505さんかっこいーwww
0508デフォルトの名無しさん
2011/03/06(日) 02:10:56.02Google の C++ コーディング規約は歴史的な事情。添えられている議論をよく読んでみるといい。
go 言語では例外と類似のエラー通知方法として panic, recover 関数がある。
これらは例外と異なり追加の制御構造を必要としないようにデザインされた。
http://golang.org/doc/go_faq.html#exceptions
0509デフォルトの名無しさん
2011/03/06(日) 02:17:07.32これはGoogleの講演会に行ったときに聞いた話なんで、信じてもらえなくてもいいんだけど、
Googleが例外を使わないのは、歴史的な事情(過去の例外安全でないコードと混ぜるため)
もあるけど、何よりGoogle の規模だとほぼすべてのコードパスが実行されうるため、
例外機構で見た目がすっきりしても処理を追いにくくなるからだってさ。
まさに、このスレで議論されてるような話だね。正しい主張かどうかはともかく。
0511デフォルトの名無しさん
2011/03/06(日) 02:18:36.41確かにコンパイラの支援がないときついかもな。
関数消してコンパイルしてみりゃ一発ではあるんだが。
0512デフォルトの名無しさん
2011/03/06(日) 02:29:00.23>例外機構で見た目がすっきりしても処理を追いにくくなるからだってさ。
ま、この主張の妥当性はおいておくとして、
それの根拠に
>何よりGoogle の規模だとほぼすべてのコードパスが実行されうるため、
を出すのは愚かだろ?
俺には
「全てのコードパスが実行される ⇒ 処理を追いにくくなる」
は、およそ論理的な主張とは思えない。
あ〜やだやだ。google 信者ってこんな奴らばっかなんだよな。
0513509
2011/03/06(日) 02:45:44.36いや、別にGoogle信者じゃないんだが。
「全てのコードパスが実行される → 暗黙的コードパスも残らず実行される → 暗黙的コードパスは追跡しがたい(が追跡しないわけにいかない)」
こんな感じ。で、メリット(見た目すっきり)とデメリット(追跡しがたい)を秤にかけただけかと。
あんたの推論はステップを飛ばしてる上に、意味の無いレッテル張りをしてる。
0514デフォルトの名無しさん
2011/03/06(日) 02:51:13.67失敗する可能性があっても、実際に失敗しないかぎり失敗時の安全性は考えなくていい、
って暗に言ってるように聞こえるんだが、正気か?
0515デフォルトの名無しさん
2011/03/06(日) 02:52:57.82お、暗黙的コードパスの追跡とか言い出したな。
458 への回答が無くて気になるんだが、かわりにおねがいできないか?
0516509
2011/03/06(日) 03:00:56.87こっちは例外使ってるし。
だから
> 正しい主張かどうかはともかく。
って書いたじゃん。
0517デフォルトの名無しさん
2011/03/06(日) 03:21:24.54>>515
関数fについてエラー処理してるコード辺があったとして。
そしてそのエラー処理が漏れていないかチェックしたいとき。
戻り値:関数fを探して、その関数でリターンしてるところをチェックし、エラー処理のコードと比較
例外:関数fを探して、例外を投げる可能性のある全てをチェックし、エラー処理のコードと比較
になると思う。
どっちが大変かな?
戻り値ベースなら、簡単な検索でかたがつくよ?
0518デフォルトの名無しさん
2011/03/06(日) 03:43:48.700519デフォルトの名無しさん
2011/03/06(日) 03:49:18.14仕様は無いのが前提なのか。その時点ですでに破綻気味だな・・・。
で、例外を使っていれば変に catch してるところが無い限り
エラー処理が「漏れる」なんて事は無いんじゃないの?
「漏れる」の意味がよくわかってないだけなのかもしれない。
戻り値で言えば if などによる分岐が無い場合を指してるんだよね?
0520デフォルトの名無しさん
2011/03/06(日) 04:01:26.60例外ベースなら、全ての投げられる型に対して
個別の例外処理を実行する必要がある、というシチュエーションです。
戻り値ベースだと、例えば整数が帰ってきて
それぞれの値に応じてエラー処理を実行します。
少し違うけど >> 418 のような感じでしょうか。
0521デフォルトの名無しさん
2011/03/06(日) 04:03:55.88それと、仕様があっても仕様とコードが対応しているか
調べるときに同様のレビューが入るのでは?
0522デフォルトの名無しさん
2011/03/06(日) 04:12:55.38そんなめんどくせー関数を仕様無しで使えってのがそもそも無理だ。
あと、結果が複数あってそれぞれの動作が別々に決まるようなら、
それはもう「エラー処理」とも少し違う気がする。例外の使える言語でも
戻り値とかで状態を返すべきところでしょ。
0523デフォルトの名無しさん
2011/03/06(日) 04:23:27.40どうも例外を使う場合は具体的な例外の型をすべて仕様として列挙することを想定してる
みたいだけど、そんなことはあんまりしない。(検査例外について言われる問題が関連する)
例外安全性のレベルを示すだけか、例外の型を示すとしても基底クラスをいっこ示す程度。
0524523
2011/03/06(日) 04:49:14.94個人的な願望で言わせてもらえば、例外安全性を示すだけにとどめた上で、例外について何も
書いてなければ強い保証を提供しながら例外を投げるものと解釈するのが楽でいい。
0525デフォルトの名無しさん
2011/03/06(日) 11:12:06.46マジレスすると
例外を使うと周囲から色々なことを期待される。
自分では戻り値+分岐と同じような使い方しかしないつもりなのに
RAIIを期待される。
所謂「驚き最小」のために、その期待を裏切らないことを期待される。
そういうことに振り回されたくないなら
最初から例外は使いませんとかC++は使いませんと宣言しておいたほうがいい
0526デフォルトの名無しさん
2011/03/06(日) 11:20:04.28Hoge(const Hoge &src, int *ret)
を使ってコピーするようにすればいいだけだよな
本来のコピコンは殺しておいて
0527デフォルトの名無しさん
2011/03/06(日) 13:13:17.00エラー処理の方法は自分個人で決めるんでなく、プロジェクトのコーディング規約に従えよ
0528デフォルトの名無しさん
2011/03/06(日) 13:27:26.18だから、なんでそれで C++ は使いませんが含まれるんだよw
おまいさんの願望をさりげなく入れんなw
0529デフォルトの名無しさん
2011/03/06(日) 13:56:19.820530デフォルトの名無しさん
2011/03/06(日) 14:50:55.46RAII は例外だけじゃなくて return や break などに対しても役に立つぞ。
例外なんぞ使わなくても C++ では当然の手段だ。難しい話でも無いしな。
それに従っておけば例外についても問題なくなるんだからおいしい話だぜ。
0531デフォルトの名無しさん
2011/03/06(日) 15:25:45.740532デフォルトの名無しさん
2011/03/06(日) 15:53:36.87「GCに従えば例外は問題ない」とすればバカでもわかる。
0533デフォルトの名無しさん
2011/03/06(日) 16:00:20.78> でも解放失敗しうるリソースにRAII使って解放エラー無視するバカが多すぎて困る
何か例をあげてみてよ。
多すぎて困るっていうぐらいなら簡単でしょ。
0534デフォルトの名無しさん
2011/03/06(日) 16:03:54.78まず、佐藤。
次に、田中だろ、高橋だろ・・・
0535デフォルトの名無しさん
2011/03/06(日) 16:10:15.09ファイル
ストリーム
データベースコネクション
スレッド
プロセス
ハンドル類
動的ライブラリ
基本的にメモリと一部の排他制御以外の全てだな
RAIIはfreeなりdeleteなりが失敗せず例外も投げないというお約束の上に立脚してることを忘れてはならない
基本はヒープメモリ専用のテクニックであって、万能の処方箋ではない
0536デフォルトの名無しさん
2011/03/06(日) 16:31:24.82>基本はヒープメモリ専用のテクニックであって
そんなこという奴、初めて見たよ。
なら、どうすれば解決できるっていうの?
もしかして「2フェーズ・デストラクション」とか言い出すの?
0537デフォルトの名無しさん
2011/03/06(日) 16:46:31.52いや、だから、実際にその点に問題があって困るコードの例を・・・
0538デフォルトの名無しさん
2011/03/06(日) 17:29:19.59そうだよ
解放に失敗しうるとすれば、それは明示的な解放をせざるを得ない
RAIIに任せっきりなんて使い方は危険極まりない
>>537
たとえばファイル閉じる時にフラッシュしようとしたら失敗したなんて時はエラー放置したらデータ飛ぶだろ?
ロック順とかの関係でロック手放し損なったりしたらデッドロックするだろ?
DB接続切り損なったままほっといたらそのうちDBサーバーのセッション数埋まっちゃうだろ?
それくらいも想像できないからファイルとかにRAII使っちゃうんだな
0539デフォルトの名無しさん
2011/03/06(日) 17:54:47.16基本は RAII で、問題になるなら明示的な終了処理を加えとけば問題ないよね。
・・・ってレスしようとしてなんかデジャブったので探してみたら、やっぱり似たような話があった。
http://2chnull.info/r/tech/1230341243/226-261
0540デフォルトの名無しさん
2011/03/06(日) 20:04:30.53逆だろう
基本は明示的な終了処理でちゃんとエラー時の対処をして、
万一解放忘れがあったとき時にエラーは無視してとりあえず解放してもらうためにRAIIがある
リソースリークという最悪を避けるための保険としてはRAIIも有効だと思うよ
だが、その場合デストラクタで解放されるというのは本来はバグだ
頼ってはいけないし、終了処理を自分で呼ぶ義務から逃れることは出来ない
0541デフォルトの名無しさん
2011/03/06(日) 20:13:50.90ファイル書き込み処理の途中で例外が発生してデストラクタでファイルが閉じられるとき、
ファイル閉じのエラーは無視して(ログに記録して済ませる程度で)元の例外だけ伝われば
いいよね。
これはバグじゃないと思うんだ。バグだというのなら、どうすればいいの?って話になるし。
0542デフォルトの名無しさん
2011/03/06(日) 22:32:04.840543デフォルトの名無しさん
2011/03/06(日) 23:12:40.840544デフォルトの名無しさん
2011/03/06(日) 23:19:58.120545デフォルトの名無しさん
2011/03/06(日) 23:46:52.46ちゃんと状況がわかった上で、その局面ではあえてエラーを無視するという選択をして、
実現方法としてデストラクタに任せるというのなら、まあいいと思う
「とにかくRAIIに任せとけばいいよwww」って連中がそこまで考えてるかどうかが問題
0546デフォルトの名無しさん
2011/03/07(月) 14:28:23.10てきとーにRAIIでリソース解放(失敗しても無視)して
てきとーにログ吐いて終了するような
使い捨てスクリプトには、C++もいいもんだよ
0547デフォルトの名無しさん
2011/03/07(月) 14:35:00.68ロンドン証券取引所(LSE)の証券システムはC++製
0548デフォルトの名無しさん
2011/03/07(月) 15:22:30.72C++1xでは是非そうしてもらおう。
0549デフォルトの名無しさん
2011/03/07(月) 15:28:15.14そういうプリプロセスツール作るとか。
あるいは自分でマクロ書いて置き換えて使えば?
0550デフォルトの名無しさん
2011/03/07(月) 16:51:09.41・例外を使いこなせない。継承も使いこなせない。if文大好き
・C++に比べたら、Cは安全だと信じてる
・いまだにemacsやvimを使ってる。IDEは使えない
・実はC++について詳しくない(思い込みで嫌ってる)
C++信者
・なんでもRAII。リソース解放の失敗?なにそれ?
・Cを書かせたら strlen をループの中に書いたり、gets使ったり、reallocでメモリリークさせたりする
・コード読まない。コードより仕様書
・C99やC1xは悪い規格である。C++と互換性がないから
0551デフォルトの名無しさん
2011/03/07(月) 16:57:21.75ホント馬鹿げてるなぁ。
0552デフォルトの名無しさん
2011/03/08(火) 00:19:20.63編集者
・信者に比べたら、中立な編集は正義だと信じてる
・2chは悪いインターネットである。編集しないから
0553デフォルトの名無しさん
2011/03/08(火) 10:23:01.26派生型の仮想関数はそれじゃ見つからなくね?
0554デフォルトの名無しさん
2011/03/08(火) 10:31:26.71両方ともdisってるように見えるが、
C++信者の方がクソプログラムを生産する素養に満ち満ちている件。
0555デフォルトの名無しさん
2011/03/08(火) 10:38:30.22> ・実はC++について詳しくない(思い込みで嫌ってる)
は当てはまって無いかと。
0556デフォルトの名無しさん
2011/03/08(火) 14:26:14.300557デフォルトの名無しさん
2011/03/08(火) 17:15:54.38C++使い涙目だなwww
0558デフォルトの名無しさん
2011/03/09(水) 08:19:17.52コードの可読性はいたずらに低く、
ご自慢の機能(RAII)は安全なプログラムを書く役にはさっぱり立たず、
コンパイラのバージョンが上がると古いオブジェクトファイルと
リンクできなくなることもあり、なのでシステム全体を再コンパイルする必要があるのに
コンパイルは糞遅く、エラーメッセージはカオス。
そんなC++が大好きです。
0559デフォルトの名無しさん
2011/03/09(水) 16:06:17.820560デフォルトの名無しさん
2011/03/09(水) 17:03:36.48今時クラス化できないって辛すぎないか?
そういう意味では文字通りC++(Cのちょっと高機能)として使うのが一番お得
0561デフォルトの名無しさん
2011/03/09(水) 17:47:34.42どうしても静的型がいいという保守的な人がC++を使う。
0562デフォルトの名無しさん
2011/03/09(水) 17:56:01.73クラスっぽいことはCだと構造体と委譲でやることになるが、
確かに委譲は書くのが面倒臭いけど、辛すぎるってほどか?
C++使った方が楽だけどね。
0563デフォルトの名無しさん
2011/03/09(水) 18:07:20.930564デフォルトの名無しさん
2011/03/09(水) 18:35:56.180565デフォルトの名無しさん
2011/03/09(水) 18:45:08.080566デフォルトの名無しさん
2011/03/09(水) 18:55:47.38ocaml には abs と abs_float があるが
C++ よりはるかにマシだ
0567デフォルトの名無しさん
2011/03/09(水) 19:05:28.060568デフォルトの名無しさん
2011/03/09(水) 19:32:02.66ありがとう。C++を使います。
0569デフォルトの名無しさん
2011/03/09(水) 20:28:17.25スレ違いです
巣に(・∀・)カエレ!!
0570デフォルトの名無しさん
2011/03/09(水) 20:37:26.10確かに C vs C++ のスレに OCaml なんて
子供の喧嘩に親が出てくるような大人げなさだが。
abs 云々なんて言語の良さとは無関係ってことさ。
そしてC++はウンコすぎるってことさ。
0571デフォルトの名無しさん
2011/03/09(水) 21:04:10.34>>569
0572デフォルトの名無しさん
2011/03/09(水) 21:08:02.01absだけじゃなくてオーバーロードのメリットを言ってるんだろ。そのくらい理解しろ
enumの型チェックが働かないCはクソ。
void *から他のポインタにチェックなしで代入できるCはクソ。
const定数で配列数を指定できないC99はクソ。
名前空間でシンボル名を整理できないCはクソ。
インライン関数が無くて副作用のあるマクロ使いまくりなC99はクソ。
そしてなにより文字列型が無い言語はアプリケーション開発に使えない。
0573デフォルトの名無しさん
2011/03/09(水) 21:09:05.70という文章にもいろんな書き方があることがわかって有意義なスレだった
終了
0574デフォルトの名無しさん
2011/03/09(水) 21:26:08.78「それは Scheme(~R5RS)!」
「厳選された必要最低限の機能に飛び道具を隠し持ったミニマル言語!!」
Java を LL で例えたら・・・
「それは Python!」
「教育目的に適した理解し易さと、お仕事で使えるパワフルさを兼ね備えた言語!!」
ObjC を LL で例えたら・・・
「それは Ruby!」
「柔軟なオブジェクトシステムと美しいクラスライブラリを持った自由な言語!!」
C++ を LL で例えたら・・・
「それは Perl!」
「かつて一時代を築いたため使用者人口はそれなり。奇麗に書く事も可能らしいよ!!」
0575デフォルトの名無しさん
2011/03/09(水) 21:27:26.09それらの性質が、実際のCプログラミングにおいてどれほどの障害になるのか、
という議論を抜きにただリストアップされても、片手落ちなわけですよ。
それほど強く主張するのだから、いくらでも語れるよね?ぜひ語ってくれ。
0576デフォルトの名無しさん
2011/03/09(水) 21:29:48.55> そしてなにより文字列型が無い言語はアプリケーション開発に使えない。
こんなもんはLLとかと組み合わせてそっちでやる。
(LL自体は内部でCを使って文字列処理を実装してるだろうけど)
0577デフォルトの名無しさん
2011/03/09(水) 21:31:42.95議論自体には有効に反論できず、
相手が低能であるということにして勝利宣言ですかwww
さすがC++使いさんは一味違いますね。
0578デフォルトの名無しさん
2011/03/09(水) 21:35:13.89> const定数で配列数を指定できないC99はクソ。
> インライン関数が無くて副作用のあるマクロ使いまくりなC99はクソ。
どういうこと?
0579デフォルトの名無しさん
2011/03/09(水) 21:37:52.67それなら納得。
>>575
void f(enum x)にenum yの値を突っ込んでエラーが出なかったり、
g(x++);とか書いたらマクロで副作用があったり、それがどの程度
問題なのか説明されないとわからないほどC使いはアフォなの?
>>578
言ってる内容が変なので、C90の間違いじゃないの?
0580デフォルトの名無しさん
2011/03/09(水) 21:40:29.33>>550
>・Cを書かせたら strlen をループの中に書いたり、gets使ったり、reallocでメモリリークさせたりする
0581デフォルトの名無しさん
2011/03/09(水) 22:06:09.29仕様が不十分なら実装を工夫する
仕様なんて飾り
0582デフォルトの名無しさん
2011/03/09(水) 22:26:58.67考えている所。暗黙の宣言とか可変個引数とか、生産性・品質は度外視。
計算機使わず手計算でも間違わなければよいとか言ってるのと変わらん。
0583デフォルトの名無しさん
2011/03/09(水) 22:30:25.37分かります
0584デフォルトの名無しさん
2011/03/09(水) 22:31:06.15おやおや、C++使いは副作用があるような危険なマクロに
関数と同じような名前付けちゃうのかい?www
それに、そんな問題は、>>231 で語られてるC++の問題同様、
ハマるとしたらハマったやつが馬鹿なのさ。
0585デフォルトの名無しさん
2011/03/09(水) 22:35:19.84それ、C++を擁護する台詞のつもりかwww
0586デフォルトの名無しさん
2011/03/09(水) 22:40:05.75C のコードを書かせたら、
・性能要求がきつい箇所で strlen() をループの判定部分に入れる
・あれだけ使うなと言われているのに、未だに gets() を使い続ける
・平気で realloc() でメモリをリークさせる
・副作用がある事を意識して使うべきマクロに関数と間違う様な名前を付ける
・厳密な型検査があれば通過しない様なコードを無意識に書く
あぶねー、あぶねーw
0587デフォルトの名無しさん
2011/03/09(水) 22:42:25.69>>413 で少し書かれてるようなC++の読みにくさは、
例外に限らずC++コードの全てに適用される。
可読性は度外視。コンパイラがパースできるなら良いと
言ってるのと変わらん。
0588デフォルトの名無しさん
2011/03/09(水) 22:44:50.980589デフォルトの名無しさん
2011/03/09(水) 22:52:16.02>滅多に無く(どこか関数の深いところから飛んでくる)、
同じ画面に無いところが例外の最大のメリットだろ。
>しかも = やら + といったオペレータからさえ飛んでくる上に、
それは不可能では無いが普通はしない。極端な例を出すなよ。
>変数の型をチェックして型を実装したコードを見つける必要があり、
? 意味わからん。例を出してくれ
>さらに継承が使われてたらクラス階層をたどる必要があり、
>ポリモーフィズムが使われてたら実行時における型が何かを知る必要があり、
継承した意味ねーだろ。頼むから継承の基本を理解してほしい。
>すなわちどこからどんな例外が飛んでくるか知るのに
>コードの様々な部分を読まなきゃならない。
例外はcatchしなきゃいけないという考えがJavaドカタ並に間違っている。
>>584
そうだな。まずCプログラマが書いたnkfとかのソース見ると危険なマクロがあるな。
0590デフォルトの名無しさん
2011/03/09(水) 22:52:56.44Cプログラマは楽にこなせるの?
0591デフォルトの名無しさん
2011/03/09(水) 22:57:39.05自分で書いたマクロで罠に嵌る奴は居ないだろw
えー、もしかして >>579 ってそういう前提だったの?
0592デフォルトの名無しさん
2011/03/09(水) 22:58:55.31子供だけでは危険だと分かってるから
0593デフォルトの名無しさん
2011/03/09(水) 23:00:05.000594デフォルトの名無しさん
2011/03/09(水) 23:03:52.210595デフォルトの名無しさん
2011/03/09(水) 23:14:26.50> 生産性・品質は度外視。
おいおい。笑かすなよ。
このスレにもRAIIがあれば catch なんていらん、なんてやつが
結構いたわけだが(もしかして>>589もそうかな?)
そんなやつらが品質とか何の冗談だよ。
0596デフォルトの名無しさん
2011/03/09(水) 23:30:11.740597デフォルトの名無しさん
2011/03/09(水) 23:33:09.04>>252
0598デフォルトの名無しさん
2011/03/09(水) 23:39:10.21コンストラクタは最低限の処理だけ、という規約がネックになっていると思う
0599デフォルトの名無しさん
2011/03/09(水) 23:39:10.24>それは不可能では無いが普通はしない。極端な例を出すなよ。
あんたのプログラムではコピーコンストラクタで例外は出ないのか?
例えば、エンコーディング情報付き文字列型を定義したとき、
異なるエンコーディング情報を持つ文字列を + で連結した場合に
例外投げるのは極端な例かい?
>>変数の型をチェックして型を実装したコードを見つける必要があり、
>?意味わからん。例を出してくれ
オブジェクトのメソッド全般。関数名だけでは一意に決まらないからな。
これは普通は問題にならんが、メールとかで patch でやりとりしてるときは
個人的にウザイと感じることがある(patchだけ見ても何の関数呼ぶか判らないから)。
が、これはちょっと難癖付け過ぎかと自分も思う。
>>さらに継承が使われてたらクラス階層をたどる必要があり、
>>ポリモーフィズムが使われてたら実行時における型が何かを知る必要があり、
> 継承した意味ねーだろ。頼むから継承の基本を理解してほしい。
継承の基本とやらを教えて?
それを理解したら、プログラムの挙動を理解したり、
テスト/デバッグしてるときに実行時における型が何かを知る必要はないんだね?
> 例外はcatchしなきゃいけないという考えがJavaドカタ並に間違っている。
詳しく。
0600デフォルトの名無しさん
2011/03/10(木) 00:30:56.85>それは不可能では無いが普通はしない。極端な例を出すなよ。
string同士の + で例外飛ぶよなw。その状態だと末期だが
>>ポリモーフィズムが使われてたら実行時における型が何かを知る必要があり、
>テスト/デバッグしてるときに実行時における型が何かを知る必要はないんだね?
処理を差し替えたくて継承してる奴に対し、呼ばれる関数が
静的に決まらないから読みづらいというのはちょっと噛み合ってない。
でもデバッガでステップインするだけのことがそんなに面倒か?
0601デフォルトの名無しさん
2011/03/10(木) 00:41:08.82いちいちvtbl探し出してポインタを手繰ってなんて…
仮想関数呼び出しは全部vtblのポインタ経由になるから遅いのも大問題だよな
0602デフォルトの名無しさん
2011/03/10(木) 00:59:57.27話が見えん。こういうことやらないて話なのか
0603デフォルトの名無しさん
2011/03/10(木) 01:08:45.86コンパイラの生成したアセンブリコード追うなんて。
そりゃC++なんて汚くて読めないはずだ。
でもCなら弱いメモリモデルのRISC最適化コードも読めちゃうんだすげー。
>>602
君の話こそ見えないよ。
0604599
2011/03/10(木) 02:28:58.26オブジェクト指向で興味深いプログラムを書くためには、
異なる型の異なるオブジェクトの相互作用を書く必要が出てくる。
例えば、
x.func(&y)
みたいなコードを考えよう。
ここでポリモーフィズムが使われてる場合、
yに対する副作用のあり方もxの実行時の型によって変化しうる。
継承は、ちゃんと設計できてれば、xの状態遷移については
全ての派生型で問題ないことを保証するだろうが、
yについてはその限りではない。
なので、xがある特定の型のときだけyが例外を投げることはありうるし、
さらに悪い状況では、ある特定の状況で特定の実行型については
x.func(&y) の呼び出し自体がバグ、ということさえありうる。
なので、継承の基本を理解すれば実行時の型を知る必要が無い、
というのは理解できないんだよね。あんたなら解る?
0605デフォルトの名無しさん
2011/03/10(木) 02:55:11.76テストするとき、ステートメントカバレッジより
ブランチカバレッジの方が、100%に近づけるのは遥かに難しいよね?
同様に、デバッガで動かしながら実行時の型を網羅していくのは
単純に読むのより、ずっと大変だよ?
0606デフォルトの名無しさん
2011/03/10(木) 03:13:27.900607デフォルトの名無しさん
2011/03/10(木) 03:33:18.38・Cは危険な言語である。ただし、低レベルプログラミングのための必要悪である。
・C++は危険な言語である。理由はCと同様である。
・C/C++は他の言語との連携がとりやすい言語である。
・他言語と簡単に連携がとれるのに、C++のような構文拡張は必要なのか?
というのが議論の発端なので、他言語のメリットが出てくるのはしょうがない。
もともと、C単体でC++と勝負してる訳じゃないのよ。
0608デフォルトの名無しさん
2011/03/10(木) 04:34:31.820609デフォルトの名無しさん
2011/03/10(木) 06:50:13.03グルーコード書くうえでC++の幾つかの機能は重宝
0610デフォルトの名無しさん
2011/03/10(木) 07:26:05.180611デフォルトの名無しさん
2011/03/10(木) 08:07:26.82>x.func(&y) の呼び出し自体がバグ、ということさえありうる。
それはyの単体試験で確認しておけばいいのでは?
そのためにyは外部とのインターフェースをpublic/privateで限定し
そのインターフェースが整合しているかどうかだけ確認できれば問題ない。
xの実体がわからないようなxとyの結合コードはその後で試験でしょ。
この時はfuncはステップオーバーする程度でxの実体なんてどうでもいい。
0612デフォルトの名無しさん
2011/03/10(木) 09:09:42.84yの単体試験でそれがバグかどうか確認できるためには、
yの任意のpublicメソッドが任意の順番で呼ばれても全て正しい動作、
というくらい強い条件を満たす必要がある。
0613612
2011/03/10(木) 09:10:35.560614デフォルトの名無しさん
2011/03/10(木) 09:14:50.96boost::Python は楽だけど、Cython はもっと楽。
結局、グルーコード自体も他言語(この場合はPython)で生成させた方が楽だったり。
0615614
2011/03/10(木) 09:30:15.57Cのマズい点をC++使いが挙げると、どうしても>>586のリストを
更新する感じになっちゃうんで、むしろC++の良いところを
挙げていく方がいい。
0616デフォルトの名無しさん
2011/03/10(木) 09:53:34.63いちいち関数の戻り値を受けるのに変数定義するのとか面倒だ。
コンパイル時に判明するだろ。
0617デフォルトの名無しさん
2011/03/10(木) 09:57:14.760618デフォルトの名無しさん
2011/03/10(木) 10:11:38.75C vs. C++のつもりで書き込むと馬鹿と言われそうだ
0619デフォルトの名無しさん
2011/03/10(木) 10:18:58.07C/C++の一つの後継であるPHPかJacascriptに統一して発展させるのがいいよ。
これでGUIや3Dも出来るようにする。
すでに実用されていて過去のソースも沢山あるし。
0620デフォルトの名無しさん
2011/03/10(木) 11:27:22.73> x.func(&y)
これで C++ の問題点を主張しようとしてるの?
C でも func が関数ポインタだったら同じことじゃないの?
あるいは x_func(&x, &y) とか。
0621デフォルトの名無しさん
2011/03/10(木) 11:31:22.81>> 例外はcatchしなきゃいけないという考えがJavaドカタ並に間違っている。
> 詳しく。
http://www.parashift.com/c++-faq/exceptions.html#faq-17.6
> Here are some "wrong exception-handling mindsets" in no apparent order:
> * The return-codes mindset: ...
0622デフォルトの名無しさん
2011/03/10(木) 12:02:02.31>Exception classes cross subsystem boundaries
C++でしか使えない例外投げてるのに、よく言うよな
共通言語なんとかの例外でも投げればいいんじゃねえの
0623デフォルトの名無しさん
2011/03/10(木) 12:29:37.98例外をcatchしたとき、どこからthrowしたか知るのは難しい。
特に下流で処理しない場合は、上流でパスが合流してしまうのでその傾向は顕著である。
おそらく、同じ「型」の例外ならば合流して良いということにしたいんだろうが、
そんな単純な例外処理ばかりじゃないし、だからといって様々な状況を区別できるよう
型のバリエーションを増やす(そのサイトにある"Using the bits / data ..."の方法)のは
>>517>>520にあるように可読性が下がる。
可読性という点でいえば、>>460のような問題もある。
あと、そのサイトの"The Java mindset:"の項では、Javaがメモリーリソース以外を
try/finally で処理するのに対し、C++はRAIIで処理するから try/catch ブロックは少なくてすむ
(この辺りが「Javaドカタ」とか>>589がいいだした理由かな?)と書いてあるけど、
メモリーリソース以外をRAIIで処理することについては>>535>>538に問題が書いてある。
0624デフォルトの名無しさん
2011/03/10(木) 12:39:59.23>C でも func が関数ポインタだったら同じことじゃないの?
同じことだね。だから、関数ポインタを使わないでも実現可能な処理は
関数ポインタを使わない方が読みやすい。
実際、関数ポインタを乱用するのは悪いコーディングスタイルだ。
>あるいは x_func(&x, &y) とか。
Cではオーバーロードさえないのでx_funcは一意に決まる。
0625デフォルトの名無しさん
2011/03/10(木) 12:45:50.75> 例外をcatchしたとき、どこからthrowしたか知るのは難しい。
fopen() がヌルを返したとき、どのシステムコールが失敗したか知るのは難しいな。
> >>517>>520にあるように可読性が下がる。
> 可読性という点でいえば、>>460のような問題もある。
> メモリーリソース以外をRAIIで処理することについては>>535>>538に問題が書いてある。
すでに全部反論なりなんなりのレスがついてるんだけど、それについてはどう考えてるの?
0626デフォルトの名無しさん
2011/03/10(木) 12:48:41.28じゃぁなんで C++ の仮想関数は「 virtual を乱用するのは悪いコーディングスタイルだ」で
済ませられないの?
あと、 C++ にはオーバーロードがあるけど x_func() の呼び出しは一意に決まるよ。
違いを言うなら、単純な grep だけじゃ定まらないってところだろうね。
0627デフォルトの名無しさん
2011/03/10(木) 12:56:18.19>>460についてる反論は、C++にはRAIIがあるから、というもので
これについては>>475>>535が再反論になる。
>>517についてる反論は、戻り値で処理するとか、投げる例外の基底型は
たかだか一つとか書いてるけど、たかだか基底型ひとつでは処理しきれない場合がある
というのが>>623の主張だし、複数の型を用意すべきというのが>>621の"Using the bits / data ..."の提案。
>>535>>538についてるレスはとても反論とはいえないね。
C++では安全性の低いプログラムしか書かないというならいいけど。
0628デフォルトの名無しさん
2011/03/10(木) 13:02:15.27OK. virtualを乱用するのは悪いコーディングスタイルだ。それでいい。
そうなるとvirtualなんて滅多に使用しないから、
C++の継承なんて全然便利じゃない。使用しないから。
だからCの構造体+委譲+必要最小限の関数ポインタでオブジェクト指向を実現するよ。
(または、動的型の言語とCを組み合わせて使うよ)
0629デフォルトの名無しさん
2011/03/10(木) 13:09:39.54templateで使うときに共通インターフェースがあると便利なんでvirtual無しでも
crass使いますけど。
0630デフォルトの名無しさん
2011/03/10(木) 13:14:39.72関数ポインタ使わずにできるのそれ?
0631デフォルトの名無しさん
2011/03/10(木) 13:27:37.53RAII は役に立つし、デストラクタでのエラー処理が問題になるなら
明示的な破棄処理と組み合わせて正しく処理にもできる。 (>>539-545)
> たかだか基底型ひとつでは処理しきれない場合がある
そういう状況だと戻り値でも同じか、例外のほうがいくらかマシな状況にはなってるんじゃないの?
0632デフォルトの名無しさん
2011/03/10(木) 13:29:32.64「最小限の virtual 」でやったほうが楽だし間違いも減るんじゃない?
0633デフォルトの名無しさん
2011/03/10(木) 13:41:04.31http://users.softlab.ece.ntua.gr/~ttsiod/cpp.html
http://www.reddit.com/r/programming/comments/fzwlh/for_c_programmers_that_hate_c/
> 191 ポイント (70% like it)
> 330 up votes 139 down votes
> # 492個のコメント
0634デフォルトの名無しさん
2011/03/10(木) 15:27:07.61あまり使わない処理が構文でサポート(トラップ込みで)されてるよりも
シンプルな言語でやりくりしたい。
そんな好みが尊重されてもいいと思うの。
0635デフォルトの名無しさん
2011/03/10(木) 18:20:18.16templateで総称型やりたいってのは、また別の話じゃ?
>>630
vtable相当のことをやりたかったら関数ポインタ必要。
今はそうじゃない(できるだけvirtual減らす)という話なので、
関数ポインタなんて無くてもできる。
>>634
構文サポート欲しいってのも好みだけどね。
0636デフォルトの名無しさん
2011/03/10(木) 20:59:06.12仮想関数はhoge.foo()じゃなくてhoge.virtual[foo]()みたいに呼び出すようにすべきだった
0637デフォルトの名無しさん
2011/03/10(木) 21:12:04.36明示的な破棄処理を書けば正しく処理できるのは否定しないよ。
ただ、明示的に書く必要があり、RAIIは保険として使うというのなら
>>467>>472や>>621の"The Java mindset:"に書いてあるような
RAIIがあればtry/catchを減らせる、というのは成り立たないよ。
>> たかだか基底型ひとつでは処理しきれない場合がある
> そういう状況だと戻り値でも同じか、例外のほうがいくらかマシな状況にはなってるんじゃないの?
そっちが何を比べてどうマシと言っているのか分からないけど、>>517のような場合
> 戻り値:関数fを探して、その関数でリターンしてるところをチェックし、エラー処理のコードと比較
> 例外:関数fを探して、例外を投げる可能性のある全てをチェックし、エラー処理のコードと比較
の二つなら、前者のほうが圧倒的に楽だと思うよ。
0638デフォルトの名無しさん
2011/03/10(木) 21:21:31.84どうせ実行時の型を無視できないなら動的型付け言語でいいよね。圧倒的に生産的だし。
0639デフォルトの名無しさん
2011/03/10(木) 23:30:03.78>継承は、ちゃんと設計できてれば、xの状態遷移については
>全ての派生型で問題ないことを保証するだろうが、
継承だけじゃなくテンプレートとかも、きちんと設計するのは苦痛だよな。
必要最低限だけ確実に実装すれば、プログラマ同士が満面の笑みでがっちりと
握手出来るのが C や LL の良い所。
0640デフォルトの名無しさん
2011/03/11(金) 00:32:12.41テンプレートやら何やら発明された瞬間に全世界が変わるのが普通
変化を拒否したら負け
という世界観
0641デフォルトの名無しさん
2011/03/11(金) 01:05:26.43> ただ、明示的に書く必要があり、RAIIは保険として使うというのなら
> >>467>>472や>>621の"The Java mindset:"に書いてあるような
> RAIIがあればtry/catchを減らせる、というのは成り立たないよ。
どういうことなの?
たとえば Java で File は finally の中で close() しなければリソース漏れを
起こす可能性があり、 finally を書くために try ブロックが必要になる。
これに対して C++ の std::ofstream は正常フローの最後に close() の
明示的な呼び出しを書いておけば、リソース解放のために例外を catch する
必要は無く、当然 try ブロックも不要になる。これは RAII による恩恵だ。
・・・と思ってるんだけど、何か間違ってる?
0642デフォルトの名無しさん
2011/03/11(金) 01:19:34.07>>517 の問題は( >>519 で指摘の入っているとおり)関数の仕様が無い状態で
「すべて漏れなく処理」を望んでいる時点ですでに破綻している。
戻り値なら簡単に可能であるかのように書かれているが、ある時点の実装を見て
実際の戻り値を洗い出しても、仕様が無ければ後で追加・変更される可能性が
あり、そうすれば当然漏れが出る。
問題が破綻しないように事前に仕様があるという前提を置けば、戻り値なら
if (result == FOO_ERROR) ... で、例外なら catch (FooError& e) ... で、
同様のコードを書くことになる。
エラーに対してのリアクションが、もっとも典型的な「リソースを解放しながら
処理を中断する」というものであった場合、例外+ RAII のほうが間違いを
起こす可能性が少なく、後で例外が増えても問題は起こらず、こういった点で
マシだと考えている。
エラーに対してのリアクションが↑以外の何か固有の処理で、しかも処理方法が
異なるエラーが複数返ってくるというなら、 >>522 の言うとおりだろう。
0643デフォルトの名無しさん
2011/03/11(金) 01:23:22.42「C や LL」で設計するのと C++ で継承やテンプレートを設計するのと、
何が違って苦痛なの?
「必要最低限だけ確実に実装すれば〜」って話も、「C や LL」は
よく知ってるのに C++ はよく知らないプログラマならそうだろうっていう
当然の話じゃないの?
(「よく知ってる」人口の違いを言ってるんなら否定はできない気はする。)
0644デフォルトの名無しさん
2011/03/11(金) 01:29:16.33>「必要最低限だけ確実に実装すれば〜」って話も、「C や LL」は
>よく知ってるのに C++ はよく知らないプログラマならそうだろうっていう
>当然の話じゃないの?
どゆこと?
「C と LL と C++ の全てを知っているプログラマは必要最低限以外の実装も
きっちりこなすはずだ」と言いたいの?
0645デフォルトの名無しさん
2011/03/11(金) 01:40:52.06いやぜんぜんちがう。
「必要最低限だけ確実に実装すれば〜がっちりと握手出来る」なんてのはソフトでも
ハードでも、ほとんど何にでも言える話で、それが C++ ではそうはいかないとなると、
「必要最低限」を示した文書が読めないとかそういう話なのかな、と。
テンプレートライブラリが引数に対して明示する要求(「コンセプト」と呼ばれるもの)は
慣れてないと何が書いてあるのかさっぱりわからない、とか。
↓こんなやつね。
http://www.sgi.com/tech/stl/InputIterator.html
0646デフォルトの名無しさん
2011/03/11(金) 01:48:39.22C や LL では「必要最低限」は文書で示す物ではないからね。
そこまでしないと使えない言語を使うのは苦痛だな。
0647デフォルトの名無しさん
2011/03/11(金) 01:52:18.63別にコンセプト使わなきゃ C++ 使えないわけじゃないし、
似たようなことを C でマクロ使ってやろうとすれば同じようなことになるし、
やっぱり >>639 の真意はわからない。
0648デフォルトの名無しさん
2011/03/11(金) 02:00:38.70C++ はちゃんと設計すれば問題無いと言う人間が居たり、
C++ でも設計しないでプログラムを書けると言う人間が居たり、
話がコロコロ変わって大変ですね。
0649デフォルトの名無しさん
2011/03/11(金) 02:10:07.470650デフォルトの名無しさん
2011/03/11(金) 02:11:02.310651デフォルトの名無しさん
2011/03/11(金) 02:14:24.180652デフォルトの名無しさん
2011/03/11(金) 02:16:02.040653デフォルトの名無しさん
2011/03/11(金) 02:37:01.23それは開放閉鎖原則といって
継承を正当化するためのキャッチフレーズのようなものらしい
0654デフォルトの名無しさん
2011/03/11(金) 02:39:10.12レス番間違えてるよ
0655デフォルトの名無しさん
2011/03/11(金) 09:56:08.89こういう理解度でもC++が使えるのは、C++の利点といえるのだろうか?
0656デフォルトの名無しさん
2011/03/11(金) 09:59:02.500657デフォルトの名無しさん
2011/03/11(金) 10:05:42.02なんでどこが間違ってるか書けないの?
0658デフォルトの名無しさん
2011/03/11(金) 10:18:08.47>>657
その例では、例外が投げられたとき呼び出されてるのは正常系のcloseじゃなく
デストラクタだよ。ofstreamはデストラクタでcloseしてくれる。
でも、デストラクタではファイルクローズに失敗したときに出来ることは殆ど無い。例外投げれないし。
実際、ofstreamはデストラクタでは失敗を無視する。
なので、ちゃんとリソース解放の失敗まで含めて安全なプログラムするなら
RAIIじゃ駄目なときがある。駄目な場合の例は>>535
0659デフォルトの名無しさん
2011/03/11(金) 10:23:09.78RAIIでは十分じゃない場合が多々ある(>>535)ということが書かれているのに、
それでもRAIIのほうが間違いを起こす可能性が少ないというならば、
ちゃんと理由を書いてほしい。
0660デフォルトの名無しさん
2011/03/11(金) 10:34:32.72>>521でも指摘されてるけど、コードと仕様が対応しているかチェックする必要があるよね。
だから仕様はあるという前提でいいかと。
> 問題が破綻しないように事前に仕様があるという前提を置けば、戻り値なら
> if (result == FOO_ERROR) ... で、例外なら catch (FooError& e) ... で、
> 同様のコードを書くことになる。
ここで話題にされてるのは、書く難しさではなく読む難しさだよ?
仕様に記述されていない例外が本当に投げられない
(例外仕様を使うならstd::unexpected()が呼び出されない)
ということを確信するためにはいったいどれほどのコードを読む必要があるのか。
って書いてから気がついたけど
> エラーに対してのリアクションが↑以外の何か固有の処理で、しかも処理方法が
> 異なるエラーが複数返ってくるというなら、 >>522 の言うとおりだろう。
ってあるから、もしかしたら持ってる見解は同じなのかもしれない。
でも、それってそんなに特殊な例かな? >>621のリンク先ではそういう処理を
例外で扱う話がFAQで載ってるんだけど。
0661デフォルトの名無しさん
2011/03/11(金) 10:41:04.23> 正常フローの最後に close() の明示的な呼び出しを書いておけば
って書いてあるのに読み飛ばしてる?
0662デフォルトの名無しさん
2011/03/11(金) 10:48:36.26詳しく。
こっちは open() 〜 close() の間のどこかで例外が投げられたケースを考えてた。
0663デフォルトの名無しさん
2011/03/11(金) 10:55:03.76> でも、それってそんなに特殊な例かな? >>621のリンク先ではそういう処理を
> 例外で扱う話がFAQで載ってるんだけど。
どこのこと言ってるの?よくわからない。
「このエラーのときはこうする」ってのがいくつか決まってることはあるだろうと思うけど、
その場合はハナから列挙されてない例外について考慮する必要はないだろう。
「漏れなく」があるとしたら型は関係なくて「ここでは例外などで処理を中断しては
いけない」という話になるんだろうけど、それなら catch (...) すれば(してあれば)いい
わけで。これはいろんな戻り値を返す関数での「その他のエラー」ってやつに対応する
ことになる。
特定の場所で全部の例外を漏れなく catch なんて仕様は稀だと思うけど、こればっかりは
言い切れないからなぁ。やっぱり例を示してもらうのがいいんだろうね。
仮に、投げる例外を列挙した仕様が先に確定してしまっていたのなら、例外仕様を使うか、
あるいは関数の実装全体を catch (...) で囲うかしてあればよくて、そうじゃなければ漏れてる。
(こんなコード書かせる仕様に文句を付けたいところだというのはお忘れなく)
0664デフォルトの名無しさん
2011/03/11(金) 11:06:14.42もちろんずっとそのケースを想定してるわけなんだけど、
伝わらないようだから具体的なコードを書いてみようと思う。
template<typename T>
void save_to_file(char const* filename, T const& obj)
{
std::ofstream file(filename);
file.exceptions(std::ios::badbit | std::ios::failbit);
file << obj;
file.close();
}
このコードで、 file << obj で何かに失敗して例外が飛ぶと仮定しても
リソース漏れは起こらずその例外は呼び出し元に伝えられる。
逆に file << obj が成功して file.close() が何かに失敗し場合、
file.close() から std::ios::failure (あるいはその派生型)が例外として
伝えられ、それがそのまま呼び出し元に伝えられていく。
0665664
2011/03/11(金) 11:21:40.58デストラクタで close() か何か失敗したときの話は >>541 ね。
0666デフォルトの名無しさん
2011/03/11(金) 11:56:41.69> どこのこと言ってるの?よくわからない。
"Using the bits / data within ..."の銀行サブシステムの三つの例外の話。
>>665
ファイル自体に問題があって書き込み失敗したのなら>>541だけど、
file << obj が内部で文字列のエンコーディング変換に失敗とかして
データの一部が破損しちゃった場合、
それで例外が投げられたのならファイルクローズの失敗には対処したいよ。
0667デフォルトの名無しさん
2011/03/11(金) 12:08:35.66> 仮に、投げる例外を列挙した仕様が先に確定してしまっていたのなら、例外仕様を使うか、
列挙した仕様が先にないのなら、仕様があれば例外コードが読みやすいって話はなんなの?
それに例外仕様は投げられる可能性のある型をコンパイル時にチェックしてくれるわけじゃない。
コメントとあんまり変わらん。
あと、catch(...)は万能だけど、そこ通ったら普通はバグじゃない?
もしバグじゃないなら、あんたとは分野が違うってことで納得する。
0668デフォルトの名無しさん
2011/03/11(金) 12:13:35.22> 「漏れなく」があるとしたら型は関係なくて
どうしてそうなる?詳しく。
0669デフォルトの名無しさん
2011/03/11(金) 12:37:59.06ファイルcloseのエラーはリソース解放の失敗を意味するわけじゃないよ。
バグで間違ったハンドル渡してるとかのケースは別として。
0670デフォルトの名無しさん
2011/03/11(金) 12:40:42.37write や fflush の失敗かもしれないって?知ってるって。
0671デフォルトの名無しさん
2011/03/11(金) 12:54:47.54バカすぎ
0672デフォルトの名無しさん
2011/03/11(金) 16:14:37.50better C などと甘言を弄してCプログラマをC++へ引き込もうとしてる。
そんな安い態度が見え見えなので、Cプログラマは嫌悪を示している。
0673デフォルトの名無しさん
2011/03/11(金) 17:03:40.86> 特定の場所で全部の例外を漏れなく catch なんて仕様は稀だと思うけど、こればっかりは
> 言い切れないからなぁ。やっぱり例を示してもらうのがいいんだろうね。
>>621のリンク先の subsystem in a banking app. の例でもいいんだけどさ。
subsystem を呼び出すとき、呼び出した場所の近傍でそいつが投げる例外を
漏れなく処理するのは普通だよ。
そんなのはシステム境界面で処理しないと発散してしまう。
0674デフォルトの名無しさん
2011/03/11(金) 17:15:28.13このスレの抗争はそれが原因か……
0675デフォルトの名無しさん
2011/03/11(金) 19:17:04.99おめえ、データベースのセッション中になんかエラーがあったら
セッション切断し損なっても無視するっていってんの?
おめえの方法だとそういうことになるんだけど。
0676デフォルトの名無しさん
2011/03/11(金) 21:11:46.28C++ PG「なんでC使ってるんすか?C++理解できないんすか?www」
C PG 「何でってCで十分だからだけど」
C++ PG「C++理解できないんすねwwwロートルwww」
C PG 「(うぜぇ……)で、何の用ですか?」
C++ PG「パッチ書いてあげましたよ。もちろんC++でwww」
しかし平均的C++プログラマは>>586なので、パッチはゴミである。
C PG 「……全然使い物にならないんだけど」
C++ PG「は?C++なのにダメなわけないじゃないすか!C++ですよ!?」
C PG 「そういう問題じゃ……」
C++ PG「やっぱりロートルはダメだなー!C++が理解できないなんて!!」
C PG 「もう帰ってくれ……」
こうやってCプログラマはC++を嫌っていくのである。
0677デフォルトの名無しさん
2011/03/11(金) 23:24:19.940678デフォルトの名無しさん
2011/03/12(土) 00:00:19.37> file << obj が内部で文字列のエンコーディング変換に失敗とかして
> データの一部が破損しちゃった場合、
> それで例外が投げられたのならファイルクローズの失敗には対処したいよ。
「対処」って、具体的にどうしたいの?
「エンコーディング変換に失敗」を捨てて「ファイルクローズの失敗」を通知
するの?それとも両方の情報をどうにかして混ぜたエラー(戻り値のビット和
とか例外オブジェクトの入れ子とか)を通知するの?それ以外?
・・・こういう聞き返しが要らないように念押して >>541 を挙げてたん
だけどなー。残念。
0679デフォルトの名無しさん
2011/03/12(土) 00:06:04.33「なんかエラー」と「セッション切断し損なった」との2つのエラーについて、
無視しないとしたらどうしたいのか、つまり >>678 と同様のことを聞きたい。
あと、具体的にどのデータベース API を想定しているのか示してもらえると
話がわかりやすいんで、できればおねがい。
0680デフォルトの名無しさん
2011/03/12(土) 00:43:50.96> "Using the bits / data within ..."の銀行サブシステムの三つの例外の話。
んー?これが「エラーに対してのリアクションが何か固有の処理で、しかも
処理方法が異なるエラーが複数返ってくる」という例なの?
そこで挙げてる三つの種類の例外がひとつの関数から飛んでくるなんて話には
なってないし、それを一箇所で全部 catch しないといけない、なんて話にも
なってないよ?
例外オブジェクトの区別にはオブジェクト内のデータじゃなくて型を使うべし、
っていう話でしょ。
それに、関数呼び出しに対してそこから投げられる例外を逐一 catch する
ようなやり方は "The return-codes mindset" として否定してるし。
まぁ元々の「それってそんなに特殊な例かな?」については、わりとよくある
だろうと思ってるから、深く突っ込む必要はなさそうだけどね。
そういうときは戻り値を使って分岐したほうがいいだろうと思う。で、たぶん
それらは「エラー」とは呼ばない。
0681デフォルトの名無しさん
2011/03/12(土) 00:50:14.71> 列挙した仕様が先にないのなら、仕様があれば例外コードが読みやすいって話はなんなの?
仕様があるときの話を聞かれてるのか、ないときの話を聞かれてるのか、よく
わかんない。書き込みミスってない?
「〜って話」をアンカーで指してもらえるとたぶんわかる。
> それに例外仕様は投げられる可能性のある型をコンパイル時にチェックしてくれるわけじゃない。
> コメントとあんまり変わらん。
そうだね。残念だね。でも動作は明確に変わるよ。それが望ましいことは
少ないんだけど。
例外仕様の動作を受けれるという前提なら、とりあえず仕様に列挙された例外と
コード中の例外仕様に記載された例外を見比べれば対応は明確だ、という話ね。
前提があまり成り立たないだろうとは思ってる。
> あと、catch(...)は万能だけど、そこ通ったら普通はバグじゃない?
C やアセンブリやそのほか例外を想定していない何かの API と C++ との境界
では必要になる。すべての例外を catch するのが正しいので、バグじゃない。
0682デフォルトの名無しさん
2011/03/12(土) 00:53:27.13「漏れなく」ってところでは catch (...) が必要になるし、それが書いてあれば
仕様どおり漏れなく catch されていることは明確だから。
これで話がつかないなら「漏れなく」の意味が何か違うのかもね。
0683デフォルトの名無しさん
2011/03/12(土) 02:42:20.52std::fcloseやstd::fstream::~fstreamは確実に解放を成功させるから、POSIXのcloseみたいに
エラーコードを見て適宜繰り返し呼ぶ必要はないのよ
0684デフォルトの名無しさん
2011/03/12(土) 08:03:56.83>>673
0685デフォルトの名無しさん
2011/03/12(土) 08:07:39.68> だから仕様はあるという前提でいいかと。
って書いてるよ?
とうか、そっちが勝手に仕様が無い前提の話をしてるだけじゃない?
質問者がそんなこと言い出したことは一回も無いよ?(あったらポインタ示して?)
仕様とコードを一致させるためコードレビューが必要とは言ってたけど。
もしかして、質問者は仕様もろくにないような開発をしているんだ、
という印象操作のつもり?
0686デフォルトの名無しさん
2011/03/12(土) 08:14:41.61このアホはC++でうまく扱えないケースは扱わなくていい、ということにしたいのか?
もちろん両方通知する。
変換に失敗した文字列に関する情報と、成功した文字列が正確にファイルへ
書き込み完了したかどうかは独立の問題だからだ。
そしてお前はアホだからデータベースはうまく扱えない>>675
0687デフォルトの名無しさん
2011/03/12(土) 08:19:21.12あんたは>>673のような書き込みを見ても、それでもサブシステムから投げられる
例外を漏れなく処理する、というのをcatch(...)で受け取ることだと思うんだ?
ほんと、分野が違うわ。
0688デフォルトの名無しさん
2011/03/12(土) 08:31:52.85そうだね。そのファイルストリームに対して出来ることは何も無いね。
でも、誤解する人もいないだろうけど、ストリームが解放されることと
期待した結果が得られる(ファイルクローズ成功)ことは別。
ここでリソース解放の失敗と言ってるのは、明らかに後者のこと。
そしてそのストリームに対してできることが無いことは、
アプリケーションにやることが無いことを意味しない。
0689デフォルトの名無しさん
2011/03/12(土) 13:38:23.32RAIIはリソース解放処理を簡潔にし解放に関するバグを根絶する為の
手法なのであってI/Oエラー対応は全然別の話。
0690デフォルトの名無しさん
2011/03/12(土) 14:44:21.47「発散する」って、何が?それが発散するとどう困るの?
0691デフォルトの名無しさん
2011/03/12(土) 14:59:45.85んー。聞きたいことがはっきりとはわかってないんだけど、
「投げる例外型を列挙した仕様が無い場合、
例外ベースの処理は読むのがむずかしいのではないか?」
という話かな?
例外型の列挙が無くても、処理が失敗するかどうか(つまり例外が発生するかどうか)と
失敗した場合の状態(例外安全性のレベル)についての仕様があれば、多くの処理では
あまり問題なかったりする。
(個人的にこう思ってるけど、このことについて強い自信があるわけじゃない。
問題のあるケースがあれば知りたいと思ってる。)
この考えの元では、新しく書くコードでも例外発生時の動作として問題になるのは、
変に catch して例外を握りつぶしたり意味の違う例外にしてしまわないこと(例外中立の維持)と、
例外発生時の状態を不正にしないこと(例外安全性の維持)の2点になる。
前者は catch してるところを見れば明らかで、後者は RAII の徹底ができているかを
見ればいい。後者について副作用の順序を確認するのは簡単とは言えないけど、
それは例外特有の話ではなく、戻り値でもそれ以外のエラー通知方法でも同じこと。
0692デフォルトの名無しさん
2011/03/12(土) 15:10:42.18> 変換に失敗した文字列に関する情報と、成功した文字列が正確にファイルへ
> 書き込み完了したかどうかは独立の問題だからだ。
いや、だから、その2つを個別に両方通知するべきなのは当然で、みんなわかってる。
問題にしてるのは、書き込み途中に何か問題が発生して、処理を中断してその問題を
伝えようとしてたら、さらにファイルのクローズに失敗した場合。
この場合はファイルへの書き込みは全部終わってないんだから、クローズの失敗を
大きく扱う必要は無くて、デストラクタを使って(ログの出力程度で済ませて)も問題ないよね、
って話。
データベースの話も同様に考えてる。 >>679
0693デフォルトの名無しさん
2011/03/12(土) 16:32:35.99もしかしてcatch節で後処理すること知らない人?
0694デフォルトの名無しさん
2011/03/12(土) 16:46:06.04問題のケースは↓の (1) になると思うんですが、
ここでどうするべきだという話なんでしょうか?
template<typename T>
void save_to_file(char const* filename, T const& obj)
{
std::ofstream file(filename);
file.exceptions(std::ios::badbit | std::ios::failbit);
try
{
file << obj;
file.close();
}
catch (std::exception& e1)
{
if (file.is_open())
{
try { file.close(); }
catch (std::exception& e2)
{
// ... (1)
}
}
throw;
}
}
0695デフォルトの名無しさん
2011/03/12(土) 17:17:22.37ofstreamが管理している資源はストリームだけであり、確実にファイルに書き込む責任という資源は所有していない
OO的、RAII的に言えばリソース解放というのは所有している資源の解放というのは明らか
>>641がなんて書いていようが関係無い
0696デフォルトの名無しさん
2011/03/13(日) 10:49:12.39まったくそのとおり。
だから、RAIIを使えばtry/catchブロックを減らせる、というのはナンセンスと主張してる。
リソース解放に伴うエラー(I/Oエラーなど)の対応は別にしなきゃならんのだから。
>>693
なんでそうなる?
そうじゃなくて、catch節で後処理しようぜって主張だよ。
>>641はそうじゃないだろ?
>>695
うん。それならそれでいいんだ。というより、あなたの主張は全面的に正しいと思う。
0697デフォルトの名無しさん
2011/03/13(日) 10:55:21.01サブシステムの例外をそれを呼び出した関数で処理しない場合、
呼び出した関数を呼び出す関数群、その関数群を呼び出す関数群、
などなどに例外が伝搬してしまうから。
どんな例外を投げるのかはサブシステムの機能の一部なわけで、
それが伝搬してしまうのはモジュール化が壊れてる。
モジュール化を高めるために、上に例外を再送する場合でも、
一度キャッチして自らのシステムの例外として再定義した方が良い。
実際、システム境界面で処理しない場合に、サブシステムが変更になって投げる例外が変更/増減した場合、
変更箇所がグローバルになってすごい困ると思うんだけど、どうだろうか?
0698デフォルトの名無しさん
2011/03/13(日) 11:28:10.58> そこで挙げてる三つの種類の例外がひとつの関数から飛んでくるなんて話には
> なってないし、それを一箇所で全部 catch しないといけない、なんて話にも
> なってないよ?
リンク先の該当箇所は「エラーを通知される側が、複数種類のエラーから
個々のエラーを区別する方法」を論じてる。
この時点で、一つの関数から複数種類のエラーが通知されるケースを
想定してることは明らかだ。
なぜなら1関数1エラーの場合に「通知される側がエラーを区別できない」なんて状況は、
真面目に論じるに値しないからだ(あんたにはそうじゃないかもしれないが)。
> それに、関数呼び出しに対してそこから投げられる例外を逐一 catch する
> ようなやり方は "The return-codes mindset" として否定してるし。
だれもそんなことは主張してない。
ただ、>>673>>697 のように、漏れなく例外を catch するケースはあって、
その場合に著しく読み難いと主張してる。
>>691
それは複数の"logically distinct kinds of errors"が単一の関数から投げられるケースは考えないって言ってるんだよね?
それはもういいって。
そんな単純なケースなら確かに例外はうまくいくんだろうが、それは>>621のFAQで挙げられてる銀行の例とは違う。
0699デフォルトの名無しさん
2011/03/13(日) 11:42:56.45ファイルへの書き込みは(壊れた文字列以外)全部終わってて、それで壊れた文字列と
クローズ失敗をそれぞれどうするかってケースだよ。
しょーもない例で悪いが、webをクロールしてデータを集めて、それをUTF-8変換して
ファイルに保存する場合(壊れた文字列は変換せずにまとめて別ファイルに保存)とか。
まあ、所詮作られた例なんで何とでも言えるけど、両方同時に扱うケースなど無い、なんて
ちょっと強弁しすぎだろう。
>>694
別パーティションのファイルへ書き込んだり、NFS使ってるならローカルのファイルへ書き込んだり。
あとさー、ファイルの例はあんまり深刻さが理解できないかもだけど、
データベースのセッション生殺しはヤバすぎるって(だってプログラムは切断したつもりなんでしょ?)。
それじゃすぐセッション埋まっちゃうよ。
0700デフォルトの名無しさん
2011/03/13(日) 16:42:11.88顧客 「ファイルを保存する際は、エンコーディングのエラーと書き込み完了の両方を必ずチェックしてください」
C++ PG「できません」
顧客 「え、何故ですか?」
C++ PG「RAIIではどちらか片方の例外しかキャッチできませんから。そんなことも分からないんですか?(ため息)」
顧客 「(うぜぇ……)じゃあRAII以外でやってください」
C++ PG「は?RAIIで出来ないなら仕様が悪いんですよ。仕様を変えてください」
顧客 「何でですか!?それ全然理由になってないですよ」
C++ PG「C++が理解できない無知な顧客は困るなー!わがままばっかりで!」
顧客 「……もう帰ります」
こうしてC++の業界シェアはJavaやLLに奪われていくのだった。
0701デフォルトの名無しさん
2011/03/14(月) 11:48:21.64> >>694
> 別パーティションのファイルへ書き込んだり、NFS使ってるならローカルのファイルへ書き込んだり。
さすがにそれはないだろ。ファイル名ひとつ受け取った関数のやることじゃない。
エラーを受け取ったアプリケーション側がそういう対処をするならわかるけどさ。
どうやって2つのエラーを同時に両方返すのか、って話が聞いてみたいな。
個人的に、そんな状況を報告してくるAPIにはお目にかかったことが無いんで。
0702デフォルトの名無しさん
2011/03/14(月) 12:04:07.70例外使うとコード読むのが難しくなるよ。
↓
catchしすぎだから難しいんだよ。
RAII使えばほとんどcatchしなくていいよ。
↓
RAIIはリソース解放のエラーを扱えないから、やっぱりcatchが要るよ。
↓
RAIIと明示的な解放処理と組み合わせればcatchしなくていいんだよ。
↓
失敗が重なったときに片方しか伝わらないから、やっぱりcatchが要るよ。
↓
いまここ
0703デフォルトの名無しさん
2011/03/14(月) 12:34:44.21>>700
0704デフォルトの名無しさん
2011/03/14(月) 12:37:23.63二つの例外型を多重継承した型を投げれば良いじゃん。
いちいち型を定義するのは面倒だけど、エラーというセマンティクスを
型というシンタックスへ写像するってのは、そういうことだからね。
0705デフォルトの名無しさん
2011/03/14(月) 12:44:39.16それができれば簡単なんだけど、元の例外をstd::exception&で受けてたら無理なんじゃないの?
たとえば >>694 のコードだと file << obj からどんな例外が飛んでくるかわからないわけで。
で、例外だと多重継承できれば呼び出し元の期待にはそのまま答えられそうなんだけど、戻り値のときはどうするもんなの?
0706704
2011/03/14(月) 13:16:19.25っていうか、こっちはC++が嫌いなんだよ。どうやるかなんてこっちに聞くなよ。
こっちは対処する必要があるケースを言ってるだけ。
戻り値のときは、エラーの種別を知りたいだけなら整数型でビットフラグを使う。
もっと情報が必要なときは、情報を保持した構造体を返す。
>>704で書いた多重継承っぽいことがやりたいなら構造体+委譲で。
構造体をそのまま返すか、構造体のポインタを返すか、構造体のポインタを引数で渡すかは状況によりけり。
0707デフォルトの名無しさん
2011/03/14(月) 13:36:30.38> こっちは対処する必要があるケースを言ってるだけ。
「RAII使えばほとんどcatchしなくていい」に対して、ひとつでも catch が必要な
ケースを挙げれば否定できるような流れになってるのは何なの?
そんなのレアケースでしかなくて、レアケースには専用の処理で対処できるん
だから、「ほとんどcatchしなくていい」を否定する意味ないでしょ。
「RAII使えばほとんどcatchしなくていい」と「RAIIだけでは済まないケースがある」とが
両方成り立つ可能性は無いと思ってるの?
0708デフォルトの名無しさん
2011/03/14(月) 13:37:58.01ありがとう。
なるほど、ビットフラグに、戻り値用の構造体か。
やっぱり自分では見たことないわ。
業務でやってるとけっこうあるのかね。
0709デフォルトの名無しさん
2011/03/14(月) 14:02:40.04WinAPIで使ってると思うが
0710デフォルトの名無しさん
2011/03/14(月) 14:21:38.37>>695の言い方を借りれば、RAIIはそもそも失敗の可能性があるリソースは管理していない。
だから>>641のような方法は、「一度例外が発生したら、それ以後はファイル等のリソースは管理しない」と宣言してるわけよ。
なのに管理できてるみたいな主張しているわけで、そりゃ否定されるだろ。
あと、既に例としてファイルとデータベースと二つあがってるよ?
さらに言えば、安全性度外視の使い捨てスクリプトならRAII大活躍だから。
だからRAIIは役に立つよ。うん。
0711デフォルトの名無しさん
2011/03/14(月) 17:45:00.830712デフォルトの名無しさん
2011/03/15(火) 01:32:11.99そうなの?思い当たらないな。
どれ?
0713デフォルトの名無しさん
2011/03/15(火) 03:12:29.59やったね。
http://d.hatena.ne.jp/irof/20110227/p1
> 「もう片方の例外が消えてしまう!ありえない!これだから最近の若いもんは…」なんて方のために、Throwable.getSuppressed() があります。
0714デフォルトの名無しさん
2011/03/15(火) 08:16:46.770715デフォルトの名無しさん
2011/03/15(火) 22:02:03.09ttp://n.xxad.net/watch/sm13809685
【どうすればこの欲望の渦巻く堕落した世界に私の名を残せるだろうか】
※名を残したいとは思わないがw。
【狂乱のマシンを残せばいい】
【この狂乱の世界に相応しい野獣のようなマシンを】
【狼が来たからやってきた】
【お前の平和な街は今はもう安全ではない】
0716デフォルトの名無しさん
2011/03/15(火) 22:32:15.79>>694の(1)のとこでは、書き込みできなかった例外とクローズできなかった例外をまとめてthrowできる。
Throwable.getSuppressedに相当するのがnested_exception::nested_ptrなんだけど、
getSuppressedは配列を返し、nested_ptrは1個のオブジェクトしか返さない点は異なっている。
0717デフォルトの名無しさん
2011/03/16(水) 11:12:50.38C++0x の nested_exception は Throwable でいう getCause() のほう。 getSuppressed() とは意味が違う。
0718デフォルトの名無しさん
2011/03/17(木) 09:33:14.12> 管理できてるみたいな主張しているわけで
これ、どのレスのことなの?
正しいとされてる >>695 と否定されてる >>641 の違いがよくわかんない。
0719デフォルトの名無しさん
2011/03/17(木) 10:22:52.630720デフォルトの名無しさん
2011/03/17(木) 10:30:10.620721デフォルトの名無しさん
2011/03/17(木) 12:00:42.38大雑把にいうと、>>641はRAIIでtry/catchを減らせる(置き換えられる)と主張してる。
一方、>>695は単純にRAIIとはどういうものかを説明してる。
0722デフォルトの名無しさん
2011/03/18(金) 09:03:33.000723デフォルトの名無しさん
2011/03/18(金) 13:11:31.820724デフォルトの名無しさん
2011/03/18(金) 13:56:11.51C++ は罠が多いかわりに便利な部分も多い。
0725デフォルトの名無しさん
2011/03/19(土) 09:40:08.490726デフォルトの名無しさん
2011/03/19(土) 10:51:00.160727デフォルトの名無しさん
2011/03/19(土) 10:56:10.07何使ってるのん?
どういうときにC++と使い分ける?
0728デフォルトの名無しさん
2011/03/19(土) 11:06:35.82sh, python, javascript, lua, ...
作るものや環境によって使い分ける。
・・・っていうあたりまえの答えにしかならないに決まってるんだから、
ほんとうは何を聞きたいのかよくわからんのだけど。
0729デフォルトの名無しさん
2011/03/19(土) 17:54:19.34そういう質問が出るのも無理なかろう。
0730デフォルトの名無しさん
2011/03/19(土) 18:36:52.010731デフォルトの名無しさん
2011/03/19(土) 19:07:18.93また様々なパラダイムを分け隔てなく構文サポートするという
デザイン上の決定のため、C++は壮絶なまでの糞言語へと成り下がってしまった。
そんなC++を好んで使うような人間が他の言語を使う理由って何だろう?
他の言語と比べるとC++のあまりの糞さに我慢できなくならない?
0732デフォルトの名無しさん
2011/03/19(土) 20:13:49.35OSのない環境用のプログラミング言語としてはCかC++ぐらいしか選択肢の無いことが多い。
で、Cに比べてのいろいろなメリットがデメリットを上回れば使うことになるだろう。
メリットについてはこのスレの頭からいくつも書かれてるから、拾い読みしていくといい。
0733デフォルトの名無しさん
2011/03/19(土) 20:17:13.33そりゃC++使ったことのない人間には分からんだろうねぇ。
0734デフォルトの名無しさん
2011/03/20(日) 09:08:54.030735デフォルトの名無しさん
2011/03/20(日) 17:24:00.39アマチュアならそれも許されもするが、プロはダメだ
0736デフォルトの名無しさん
2011/03/20(日) 19:04:54.18そのとおり。
プロたるもの、C++を愛し>>586を満たさねばならぬ。
0737デフォルトの名無しさん
2011/03/20(日) 22:30:18.73Cの細々とした面倒さを経験していれば、
Cに戻る気にはならない。
C++の危なさは全然飲める。
0738デフォルトの名無しさん
2011/03/21(月) 01:32:31.42・C++はCよりも読み難い
・プログラムは書くのより読む方が難しく、また読む時間の方が長い
これらの意見についてはどう思う?
0739デフォルトの名無しさん
2011/03/21(月) 10:42:54.940740デフォルトの名無しさん
2011/03/21(月) 11:44:22.02人の書いたのをいじくる保守奴隷はC
新規のプロジェクト中心なクリエイティブやつはC++
0741デフォルトの名無しさん
2011/03/21(月) 12:13:58.11C++の最低さのみならず、C++プログラマの圧倒的な低能さ
までもが余すところ無く示されたこのスレで、
一体何の冗談だよwww
0742デフォルトの名無しさん
2011/03/21(月) 13:03:54.790743デフォルトの名無しさん
2011/03/21(月) 13:28:19.78みると、お察しくださいだと思うんだがなぁ。
0744デフォルトの名無しさん
2011/03/21(月) 18:31:49.77Cプログラマも仲間にしようとするなよ。
低能なのはお前等だけだってwww
0745デフォルトの名無しさん
2011/03/21(月) 18:59:36.82そのため、適度なシンプルさ、適切な抽象化、直交性の高い規則などを好むのは
その人が優れたプログラマである良い兆候である。
一方、C++のような、場当たり的に構文が追加され、つぎはぎだらけの醜悪な文法は
良いデザインといったものから遠く隔てられている。
このようなグロテスクな文法を好む人間は、システムやデザインの良さに対する洞察力が
根本的に欠けているため、優れたプログラマである可能性は限りなく低い。
おそらく、スパゲティプログラムが何故悪いのかさえ、彼らは本当の意味では理解できないだろう。
0746デフォルトの名無しさん
2011/03/21(月) 19:10:17.67RISCの方がシンプルで整然としていて直交性が高いと持てはやす人たちが
その昔いたが、どこに消えたのやら。
0747デフォルトの名無しさん
2011/03/21(月) 20:05:57.71× 人の書いたのをいじくる保守奴隷はC
○ 長く保守される良いプログラムはC
× 新規のプロジェクト中心なクリエイティブやつはC++
○ 書き捨てスクリプトはC++
0748745
2011/03/21(月) 20:38:47.08言いたいことは、C++を好んで使う人間は優れたプログラマの可能性は低く、
典型的には>>586のようなプログラマなので、
彼らを自分のプロジェクトから排除するという目的のためだけに
Cを選んだとしても、それは十分に合理的であるということ。
0749デフォルトの名無しさん
2011/03/21(月) 21:23:53.85恐らくLinusの引用だと思うんですが、C以外も使うプログラマが
Cを好むとは今一思えない。仕方がなく使ってるだけで。
メインフレームをVM言語やLLにしましょうとか言われた場合は受け入れるんですか?
0750デフォルトの名無しさん
2011/03/22(火) 07:41:23.10え?Cは好きだし、(悪い部分もあるけど)総体としては全然悪くないと思うよ。
システムプログラミング用の言語としても、LLやVM言語を拡張するための
言語としても、適度にシンプルで扱いやすい。
でも、例えばPythonで要求が満たせるならそっち使うよ。だって楽じゃん。
0751750
2011/03/22(火) 07:44:28.52C++以外も使うプログラマがC++を好む理由は何?ってね。
0752デフォルトの名無しさん
2011/03/22(火) 07:47:16.95http://warp.povusers.org/programming/cplusplus_superior_to_c.html
> First hurdle: Error handling
> Second hurdle: Initialization and destruction baggage
> Third hurdle: Data containers
こういう問題についても C でなんとかしようと思う?
0753デフォルトの名無しさん
2011/03/22(火) 08:18:09.61エラーの処理については、C++例外を使った方が可読性が低い、とこのスレで議論されてる。
初期化と解放については、そんなものが本当にプログラミングにおいて重要な問題なのか疑問だ。
C++では例外がある上にfinallyが無いから解放はややこしい問題たりえるが、Cでは全然難しくない。
標準で便利なコンテナが提供されていないのはCの欠点だ、というのは認めざるを得ないね。
GLibとかの実装があるし、リストくらいなら自分で簡単に実装できるから不便は感じないけど、標準であるのは便利だ。
最後に、全体的な主張である(と思われる)Cで書くと冗長であるという点については、
その代わりがC++の漏れのある抽象化というならごめん被る。
0754デフォルトの名無しさん
2011/03/22(火) 09:36:21.64そのほか諸々の「漏れのある抽象化」は問題にしないの?
C以下にも利便性を優先して受け入れてる抽象化が山ほど積み重なってると思うんだけど。
CPUキャッシュとかメモリアクセス速度とかタスクとかネットワークとか電源とか。
なんでCとC++との間の違いだけことさらに問題になるの?
0755デフォルトの名無しさん
2011/03/22(火) 11:51:19.86あと、C++の漏れのある抽象化の弊害については
このスレで議論されてるけど、Cのそれは述べられてない。
何の理由も無く一緒にされても困る。
0756デフォルトの名無しさん
2011/03/22(火) 12:41:22.34>・C++はCよりも読み難い
そうは思わない。
同等レベル。
>・プログラムは書くのより読む方が難しく、また読む時間の方が長い
読みにくいコードは、どっちにしろ
読みにくい。
とくにC++だから読みにくいとは思わない。
テンプレートや例外は、使うべき範囲で
使うので、問題にはならない。
0757デフォルトの名無しさん
2011/03/22(火) 12:45:37.23C++の全仕様を使い切る必要はない。
自分が正しく使える部分のみを使え。
つぎはぎかもしれないが、うまく
使えば問題にはならない。
0758デフォルトの名無しさん
2011/03/22(火) 12:54:56.65必要充分だから。
また、ターゲットのリソース的に
他に選択肢がないから。
多少の罠があるくらいは不問。
0759デフォルトの名無しさん
2011/03/22(火) 13:01:46.03漏れがあって何がダメなの?
潔癖症なの?死ぬの?
0760デフォルトの名無しさん
2011/03/22(火) 17:38:20.53良いと言っちゃう人なのかな?
0761デフォルトの名無しさん
2011/03/22(火) 17:44:01.75こういう底なしの低能どもが群がるのがC++
0762デフォルトの名無しさん
2011/03/22(火) 18:10:58.65というか取り組もうとすらしなかった世代
まさか今の20代でC++否定とかないわな
0763デフォルトの名無しさん
2011/03/22(火) 18:52:19.58じゃあやっぱり仕方がなくC使ってるだけじゃん。
0764デフォルトの名無しさん
2011/03/22(火) 21:02:33.46こういう底なしの低能が執着するのがC
0765デフォルトの名無しさん
2011/03/22(火) 21:16:32.30だからさ、何かを主張するなら根拠を示そうぜ。
ちなみに、C++とC++プログラマのウンコっぷりはこのスレ参照。
>>763
お前は低能過ぎて適材適所って概念が理解できないのね。
0766デフォルトの名無しさん
2011/03/22(火) 22:22:10.000767デフォルトの名無しさん
2011/03/23(水) 00:04:30.620768デフォルトの名無しさん
2011/03/23(水) 00:36:13.020769デフォルトの名無しさん
2011/03/23(水) 01:05:40.32昔々、アセンブラからCに移行しようとしていた若者たちは、当時の
ベテランプログラマから「Cは遅い」だの「メモリ使用量がわかりにくい」だの
たいそう言われたものさ。
0770デフォルトの名無しさん
2011/03/23(水) 07:18:43.03>>586
0771デフォルトの名無しさん
2011/03/23(水) 07:25:39.02別にCと適当なLLなりVM言語なり組み合わせれば良いじゃん?
それも道具を上手く使うって範疇に入るだろ?
>>769
アセンブラと、レジスタやスタックを抽象化したCでは記述できる対象が違う。
Cではアセンブラの代わりにはならないし、その逆もしかり。
0772デフォルトの名無しさん
2011/03/23(水) 07:28:26.45そういった言語使っててC++の醜悪さと生産性の低さは気にならないの?
このスレのC++使いは、自分はろくに思考もせずに安易に質問するくせに、
他人の質問はスルーするから困る。
0774デフォルトの名無しさん
2011/03/23(水) 08:10:49.66これらすらも使いこなせないから手を出さないの?
それともCオンリーでがりがり書いてるの?
0775デフォルトの名無しさん
2011/03/23(水) 08:20:02.23Cと、OOやテンプレートを使えるC++では記述できる対象が違う。
C++ではCの代わりにはならないし、その逆もしかり。
0776デフォルトの名無しさん
2011/03/23(水) 08:24:33.43Cの面倒さと生産性の低さは気にならないの?
0777デフォルトの名無しさん
2011/03/23(水) 08:43:54.33参照はconst参照のみなら、あってもいい。それ以外の参照は邪魔だ。
継承については>>628。時々使うが構文サポートなんていらん。動的型付け言語でもないのに実行時の型を強く意識する必要がある。
演算子オーバーロードは可読性が下がるからマジでいらん。
最近はPythonを良く使ってる。
>>775
C++は構文糖を追加してるだけ。しかもキモイ。
Cでしか書けないところはCで、それ以外はLLで良い。
0778デフォルトの名無しさん
2011/03/23(水) 08:46:16.57>>738
あとさ、Pythonなりと簡単に組み合わせられるって言ってるじゃん。
そこ無視して何言ってんの?アホなの?
0779デフォルトの名無しさん
2011/03/23(水) 09:19:03.15実務したことない趣味グラマかCでOOとか言ってるのって
0780デフォルトの名無しさん
2011/03/23(水) 12:35:05.140781デフォルトの名無しさん
2011/03/23(水) 15:12:07.92ただの妄想じゃねーか。
0782デフォルトの名無しさん
2011/03/23(水) 19:46:40.73信じられないだろ?C++信者の発言のまとめなんだぜ、それ
0783デフォルトの名無しさん
2011/03/23(水) 22:46:14.98Juha Nieminen なんていう国際的馬鹿のことなんてどうでも良いわ。
誰が連れてきたんだよこんなカス
0784デフォルトの名無しさん
2011/03/24(木) 06:39:45.60で、C++にすると、finallyがないことに気付く
Cにも例外が欲しい、C++にもfinallyが欲しい
0785デフォルトの名無しさん
2011/03/24(木) 09:04:00.44C++のtemplateのように、うっかりチューリング完全でしたみたいなやつじゃなくて
最初からメタプログラミング用にデザインされたやつを。
0786デフォルトの名無しさん
2011/03/26(土) 13:16:28.70おれは第二級オブジェクトが欲しいとは思わない。
0787デフォルトの名無しさん
2011/03/26(土) 13:51:29.51オブジェクトをプログラムするって?
0788デフォルトの名無しさん
2011/03/26(土) 16:19:12.17クラス、スマポとテンプレートは無いと死ぬ。
あと C++0x の細々とした機能がはやく欲しいな。
これができれば C でもいいや。
0789デフォルトの名無しさん
2011/03/26(土) 18:16:21.12他人のことばかり語って
自分は語られる対象になれない
かわいそうなオブジェクトのことです
0790デフォルトの名無しさん
2011/03/27(日) 11:20:21.80> 演算子オーバーロードは可読性が下がるからマジでいらん。
それって可読性を下げるだけの使い方しかできない、キミの落ち度でしょ。
使い処を間違えてる自分を責めれば?
0791デフォルトの名無しさん
2011/03/27(日) 11:48:28.88道具の使い方は、使う人じゃなくて使われる状況で決まるんじゃないか
逆に、状況と無関係に「正しい使い方」が決まるようなものは道具ですらない
0792デフォルトの名無しさん
2011/03/27(日) 16:00:56.76C を選択してしまうかもしれない。
実際に、そう選択したことはあった。
数年前だけどね。
そんな状況では C でも悲惨だけどな。。。
0793デフォルトの名無しさん
2011/03/27(日) 18:55:21.72「良い」の基準が違うだけじゃないかなぁ。
オーバーヘッドを抑えるだとかCコンパイラ・リンカとの親和性を保つだとか、
そういうC++のミッションを無視すればそりゃ他の言語より出来が悪く見えるかもしれないけどさ。
「C++の漏れのある抽象化の弊害」ってのが何のことを言ってるのかはっきり
わからないけど、Cのstrlenやreallocの誤用は当てはまらないっていうんでしょ?
結局自分が知ってるかどうか、自然に感じるかどうかっていう基準でしかないんじゃないの?
「Cをマスターした俺をおどろかせるような抽象化の漏れは有害だ」っていう。
0794デフォルトの名無しさん
2011/03/27(日) 19:46:19.13漏れのある抽象化「ただちに詳細を知る必要はない」
0795デフォルトの名無しさん
2011/03/27(日) 22:08:31.28>>326
0796デフォルトの名無しさん
2011/03/27(日) 23:11:19.29ライブラリ関数がマクロか関数か決まってないとか、
memsetでポインタや不動小数点数を0埋めしても0にならないとか、
ctype関数にcharの値を渡しちゃダメとか、
コンパイルエラーにならないconstとか、
可変長引数での暗黙の型変換とか、
setjmpのガチガチの利用制限とか、
そういう諸々の(実装や歴史を知らないと納得できないような)罠については
理不尽だと言わないの?何が違うの?
0797デフォルトの名無しさん
2011/03/27(日) 23:17:21.06ほんと、どうかしてるぜ。
0798デフォルトの名無しさん
2011/03/28(月) 01:48:21.74つまり、悪いのは状況であって、自分ではないとw
0799デフォルトの名無しさん
2011/03/28(月) 07:37:43.48> ctype関数にcharの値を渡しちゃダメとか、
> コンパイルエラーにならないconstとか、
どういうこと?
0800デフォルトの名無しさん
2011/03/28(月) 10:20:02.46どういうこと?
0801デフォルトの名無しさん
2011/03/28(月) 13:43:59.52> ctype関数にcharの値を渡しちゃダメとか、
↑これは↓だろうな。
http://www.kijineko.co.jp/tech/superstitions/parameter-of-isalpha-is-char.html
0802デフォルトの名無しさん
2011/03/28(月) 13:48:33.97> 可変長引数での暗黙の型変換とか、
↑これも、同じサイトに載ってた↓の話かも。
http://www.kijineko.co.jp/tech/superstitions/printf-format-for-double.html
> 可変個実引数は、既定の実引数拡張によって float 型の値は double 型に暗黙的に型変換されるのです。
0803デフォルトの名無しさん
2011/03/28(月) 13:51:07.97sizeof(long) == sizeof(int)の人は要注意。
0804デフォルトの名無しさん
2011/03/28(月) 13:52:14.700805デフォルトの名無しさん
2011/03/28(月) 18:14:38.09それが罠と言う人は、それで問題おきるような使い方してるのか。
>>796の
> ライブラリ関数がマクロか関数か決まってないとか、
も含めて、そういうのが問題になる使い方の例を示してほしいな。
0806デフォルトの名無しさん
2011/03/28(月) 18:15:35.67> memsetでポインタや不動小数点数を0埋めしても0にならないとか、
わざわざmemsetって名前が付いてるのに、メモリのゼロクリアじゃなくて
数値をゼロにすると思っちゃうの?なんで?
罠っていうのはさ、例えばC++でmemsetをうっかりplain old data型以外に
適用すると未定義動作になっちゃうとか、そういうのだと思うよ。
0807デフォルトの名無しさん
2011/03/28(月) 18:52:13.58ひとつの記号がコンテクストに応じて色んな振る舞いをするっていうのは、
すごく読み辛いんじゃないかな。
Cでも、staticが状況に応じて色んな意味を持つのはうざいでしょ?
言語仕様で定義されてる振舞いだけでも、記号の多義性はうっとうしいのに
ユーザが勝手に定義できるとか、うざすぎでしょ。
0808デフォルトの名無しさん
2011/03/28(月) 20:17:34.73関数の定義域が0からUCHAR_MAXまでの正整数とEOFのみってだけだよね?
関数が、ある型の一部の定義域のみで値を持つことって普通にあると思うけど。
0809デフォルトの名無しさん
2011/03/28(月) 20:33:40.49それらのリストには、確かにCの抽象化の漏れと言えるものも含まれてる。
しかし、ライブラリ関数は「嫌なら使わなくていい」し「使われてるかどうか簡単に調べられる」し
「正しく使うのが難しいなら、使いやすいラッパーを用意する」ことも出来る。
つまり>>320でいうなら「漏れたときの対処が容易」だから、そんなに問題じゃない。
0810デフォルトの名無しさん
2011/03/28(月) 20:54:25.95好きに定義できるからといって、可読性が落ちるような使い方をするやつは
いないだろと。
<<と>>だけは変な使われ方することがあるかもしれないが。
0811デフォルトの名無しさん
2011/03/28(月) 21:34:59.12いるよ
可読性は落ちるが短く書けるとか、リスクはあるが低コストとか
すべてはトレードオフ
0812デフォルトの名無しさん
2011/03/28(月) 21:48:10.10ソースは?
0813デフォルトの名無しさん
2011/03/28(月) 22:22:51.24仕様書のどこにも書かれていない、現場のソースが重要。
仕様書だけをソースに、ctypeが云々というのも言いがかりだろう。
0814デフォルトの名無しさん
2011/03/28(月) 23:06:27.67あなた、boostを初めてみたときの「なんじゃこりゃ!?」
って驚きを忘れてしまったのよ……
0815デフォルトの名無しさん
2011/03/29(火) 00:58:48.01> しかし、ライブラリ関数は「嫌なら使わなくていい」し「使われてるかどうか簡単に調べられる」し
> 「正しく使うのが難しいなら、使いやすいラッパーを用意する」ことも出来る。
C++の問題点として挙げられているもののうち、これらにあたらないと思ってるのはどれ?
どれも同じことだと思うんだけど。
・デフォルト引数+仮想関数
・C++例外
・演算子オーバーロード
0816デフォルトの名無しさん
2011/03/29(火) 01:04:13.30「Cを選ぶ理由は無い」とか「C++を好んで使う人間は優れたプログラマの可能性は低い」とか
極端なことを言い切っちゃうから不毛な議論の種になるんでしょ。
いいかげんに学習しなきゃ。
0817デフォルトの名無しさん
2011/03/29(火) 01:20:24.16それら三つとも、「使われてるかどうか簡単に調べられる」がイマイチかなー。
どれも「定義してる側」を見れば分かるんだけど、「使用してる側」を見ても分からないんだよね。
検索性もイマイチだし。
あとC++例外は「嫌なら使わなくていい」も難しい。
標準ライブラリをごっそり諦める必要があるからね。あとコンストラクタのエラーをどうするかとか。
最後に「使いやすいラッパーを用意する」も何かピンとこない感じ。
だってそれらの機能自体がシンタックスシュガーという「ラッパー」だからね。
でも、結局は>>816でFAだわ。皆好きなの使え。
0818デフォルトの名無しさん
2011/03/29(火) 01:39:49.70トレードオフは、単純なモデルで行き詰まった場合にのみ許される複雑なモデル。
Cで行き詰まらない限り、C++で複雑なトレードオフを考えるメリットはない。
0819デフォルトの名無しさん
2011/03/29(火) 01:47:46.54Cを選択することにはトレードオフが無いかのような発言だな。
なんで>>816のすぐ後にそんな書き込みができちゃうのか不思議だわ。
0820デフォルトの名無しさん
2011/03/29(火) 09:40:04.47トレードオフは、選択肢のあるモデルで行き詰まった場合にのみ許される複雑なモデル。
Cではただ機能が不足しているので、C++からわざわざトレードオフを考えるメリットはない。
0821デフォルトの名無しさん
2011/03/29(火) 10:06:55.20C++の機能から、トレードオフで必要な機能を選択したらCになった。
0822デフォルトの名無しさん
2011/03/29(火) 10:22:14.15C++を含めると、数種類のスマポが選択肢に加わる。
0823デフォルトの名無しさん
2011/03/29(火) 10:37:58.500824デフォルトの名無しさん
2011/03/29(火) 11:17:20.91騒ぎ始めたよ。
0825デフォルトの名無しさん
2011/03/29(火) 11:25:17.83文字列の連結に+を使う言語や&を使う言語はどんなもんかね。
只並べるだけで連結できる言語(awk)もあるが、正直却って読み難いぞ。
0826デフォルトの名無しさん
2011/03/29(火) 11:47:48.85ユーザーが自由に多重定義するのとは違うから、統制がとれている。
ちなみに、連想配列があればユーザー定義型もいらないってのが動的言語の魅力。
0827デフォルトの名無しさん
2011/03/29(火) 11:53:30.87文字列の連結に+を使うのは、+記号なのに加法(交換法則)を満たさないから
実はあんまり良い定義じゃないと思う。>>826が言うように統制が取れてるから
そういうものかと受け入れられるけど。
0828デフォルトの名無しさん
2011/03/29(火) 12:06:45.04まぁでも、統制が取れない馬鹿はCでもFILE*をフラグに転用したりするから同じことって気もするけど。
0829デフォルトの名無しさん
2011/03/29(火) 12:44:29.50「行き詰らない限り」と言っても、 >>752-753 にあるように配列以上の高級なデータ構造を
扱おうとしたら機能の不足によりわりとすぐ行き詰まったりして、あまり稀でもない。
0830デフォルトの名無しさん
2011/03/29(火) 12:52:53.54その高級なデータ構造に動的な型付けをするなら、C++は使わない。
結局、静的型か動的型かで対立しているのだと思う。
0831デフォルトの名無しさん
2011/03/29(火) 13:00:06.96仕事なら統制取れるからC++は許容できる。チームの面子にもよるけど。
オープンソースだとC++は辛い。統制とり辛いし、基本patchでのやり取りだし、
それに>>676みたいなの本当に在るんだぜ。
>>829
すぐ行き詰まるから、逆にLL等と組み合わせるときに
どこまでCで書くか悩むことが少ないというメリット(?)もある。
0832デフォルトの名無しさん
2011/03/29(火) 13:02:44.68> まぁでも、統制が取れない馬鹿はCでもFILE*をフラグに転用したりするから同じことって気もするけど。
いくらなんでも、そりゃねーよwww
0833デフォルトの名無しさん
2011/03/29(火) 13:23:05.79> それに>>676みたいなの本当に在るんだぜ。
面白そうだな。リンクくれ。
0834デフォルトの名無しさん
2011/03/29(火) 13:25:32.76型チェックが弱くなる欠点があるけど、それを許容できれば
Cでもリストやハッシュくらいなら問題なく使えるけどね。
別にfor文でリストをイテレートするくらい、書き難くも読み難くもないだろう?
0835デフォルトの名無しさん
2011/03/29(火) 13:45:31.79一番有名なの>>99
あと同じLinuxだけど http://kerneltrap.org/node/2067
0836デフォルトの名無しさん
2011/03/29(火) 13:54:54.280837デフォルトの名無しさん
2011/03/29(火) 14:13:09.74FILE*をフラグに転用したりするほどの馬鹿が
C++で演算子オーバーロード使ったらどうなるのっと
0838デフォルトの名無しさん
2011/03/29(火) 14:18:00.53要するに彼らには必然的にマルチプラットフォームであらゆる環境への対応が必要で
道路が整備されていないところで自動車を使うのは危険だ馬車を使うのが最も良い選択だ
馬車でも馬を交換しながら走れば車と同じように走ることはできる
と言ってるようなもん
0839デフォルトの名無しさん
2011/03/29(火) 14:32:09.62C++ :十得ナイフ。ただし全部の刃が専用ナイフと同等の大きさ。通常の人間の手には大きすぎ使い難い。
0840デフォルトの名無しさん
2011/03/29(火) 14:44:02.25何も問題ない。C++は神の言語だからどれほどの馬鹿が使っても
問題が起こらないように設計されてる。
実際にC++使いは馬鹿ばかりだが何の問題も起こってない。
0841デフォルトの名無しさん
2011/03/29(火) 14:52:32.46本当にいたんだってばw
main()が延々と1000行位続く中で、先頭のほうでFILE*を使ってファイル読み込みが終了。その後でフラグとしての余生をw
記憶に間違いなければこんな感じ。
--
#include<stdio.h>
//他、色々使ってなくても色々インクルード
main(int argc, char**argv)
{
FILE*fp;
//その他有象無象の変数群が100行ほど
if(!(fp=fopen(argv[1],"r"))) exit(-1);
//ファイル(確かcsv)読み込み処理が200行ほど
fclose(fp);
if(func()<0)fp=0;//この関数もトンデモだった気がする
//なんかの(演算)処理が400行ほど
if(!fp)
{
//更になんかの処理(出力向けの文字列加工だったか)が200行ほど
}
//結果の出力に100行ほど
}
0842デフォルトの名無しさん
2011/03/29(火) 15:59:01.36C++使いはウンコ、まで読んだ
0843デフォルトの名無しさん
2011/03/29(火) 21:41:56.39わらた。
でも個人的には、クラスやテンプレートが
ないと、ウンザリしちゃうんですが。
>>827
気持ちはわからんでもないけど、
合理的な主張ではないと思う。
一般的に受け入れられる表記なら、
統制とやらにかかわらず受け入れる
べき。だいたいわかりやすくなれば
いんじゃね。
0844デフォルトの名無しさん
2011/03/29(火) 23:24:02.77変数に型のない言語も、一般的に受け入れられているよ
受け入れちゃいなよ
0845デフォルトの名無しさん
2011/03/29(火) 23:45:04.55これを読むと、結局Cにも高等アセンブラ以上の価値は無いってことなんだろうか。
0846デフォルトの名無しさん
2011/03/30(水) 07:25:31.34いや、低能プログラマ判別装置としての役割があるか
0847843
2011/03/30(水) 09:32:14.51受け入れてる。最近はPerlばっかり。
ただそういうのが使えない環境は
やっぱりあって、そこではC++を
使いたい。オレは。
0848デフォルトの名無しさん
2011/03/30(水) 10:29:03.85その環境がもっと有名になれば、C++の評価も上がるんじゃね
PerlやC#は、OSの環境を前面に押し出して成功したんだろ
0849デフォルトの名無しさん
2011/03/30(水) 13:43:26.520850デフォルトの名無しさん
2011/03/31(木) 01:06:21.360851デフォルトの名無しさん
2011/03/31(木) 01:38:33.37動的言語 = 性能が出ない代わりに便利だから普及している
という認識が一般的だと思ってたわ
0852デフォルトの名無しさん
2011/03/31(木) 10:59:25.05ばーか。
動的言語も使えるけどC++を選ぶってならともかく、
使えないからC++を選ぶっていうんだから、不便だろ。
0853デフォルトの名無しさん
2011/03/31(木) 12:25:27.840854デフォルトの名無しさん
2011/03/31(木) 12:42:22.950855デフォルトの名無しさん
2011/03/31(木) 14:18:11.43もっとしょぼい環境が流行ってくれないとC++使いは困っちゃうね
0856デフォルトの名無しさん
2011/03/31(木) 14:19:28.770857デフォルトの名無しさん
2011/03/31(木) 15:48:02.83こんなスレで苛めなくても良いのに
0858デフォルトの名無しさん
2011/03/31(木) 23:49:00.89リソースの限られた環境向けのプログラムが C/C++ じゃないといけないという事も
無いんじゃないの。
0859デフォルトの名無しさん
2011/04/01(金) 01:14:54.670860デフォルトの名無しさん
2011/04/01(金) 01:22:14.970861デフォルトの名無しさん
2011/04/01(金) 01:29:26.31グラフを見てもC++の人気は下がってるね。
C++ってほんとに落ち目だね。
0862デフォルトの名無しさん
2011/04/01(金) 08:49:07.700863デフォルトの名無しさん
2011/04/01(金) 09:13:18.39Windowsではメイン開発言語の座をC#に奪われてしまい、
OS Xではそもそも相手にされていない。
いまさらC++を選ぶ理由なんてないな。
0864デフォルトの名無しさん
2011/04/01(金) 13:36:36.35意味不明。
0865デフォルトの名無しさん
2011/04/01(金) 13:38:17.58> 6.その他、明らかな煽りや無意味な書き込みも無視でお願いします。
0866デフォルトの名無しさん
2011/04/01(金) 13:55:06.60「C++の人気は上がってる!」って喜んじゃって
嬉々としてリンク張っちゃったのかな?
ちょっとでも英語読めれば、全然逆のこと書いてあるの分かったのにね。
0867デフォルトの名無しさん
2011/04/01(金) 13:58:13.75MacはObjective-Cがメインでしょ
0868デフォルトの名無しさん
2011/04/01(金) 13:58:52.190869デフォルトの名無しさん
2011/04/01(金) 14:04:37.16アニオタかよ
0870デフォルトの名無しさん
2011/04/01(金) 14:05:47.17お前には分からんだろうが、速度が必要な所にはSTLとか使うし。
0871デフォルトの名無しさん
2011/04/01(金) 14:42:57.79本当に低能C++使いは新しいこと覚えるの苦手なんだね。
0872デフォルトの名無しさん
2011/04/01(金) 15:01:12.26> 6.その他、明らかな煽りや無意味な書き込みも無視でお願いします。
もういっこ。
> 1.Java、C#などの「C/C++」以外は論外。これらについて言及している
> レスは無視してください。
0873デフォルトの名無しさん
2011/04/01(金) 15:04:34.38お前には分からんだろうが、NSArray や CFArray は std::vector の代わりにはならないww
0874デフォルトの名無しさん
2011/04/01(金) 15:06:49.47C++に関連した事象を述べてるだけだよ。
0875デフォルトの名無しさん
2011/04/01(金) 15:14:45.12そりゃそーだ。だからライブラリの受け渡しするときは、
いちいちstd::vectorをNSArrayに変換しなきゃいけないよね。面倒くさいね。
あと、Objective-CとC++はそれぞれ独自の例外処理を持ってるけど、
混ぜて使うと簡単にリソースリーク起こすよね。
だから混ざらないようにtry/catchの嵐になるね。馬鹿だね。
0876デフォルトの名無しさん
2011/04/01(金) 15:51:46.33> std::vectorをNSArrayに変換
馬鹿丸出し。
0877デフォルトの名無しさん
2011/04/01(金) 16:16:26.55語れば語るほど低能さを露呈するからwww
0878デフォルトの名無しさん
2011/04/01(金) 16:40:51.55try/catchの嵐www
0879デフォルトの名無しさん
2011/04/01(金) 20:08:43.20用途はDLL作成とコマンドラインツールが主です
0880デフォルトの名無しさん
2011/04/01(金) 20:24:46.92その用途ならどっちでもいいんじゃね?
このスレでは論争ごっこして遊んでるけど、CもC++も十分実用的な言語だから。
プログラミング初心者ならC++は少し難しいかもなぁ。
0881デフォルトの名無しさん
2011/04/01(金) 20:38:54.980882デフォルトの名無しさん
2011/04/01(金) 20:53:24.080883デフォルトの名無しさん
2011/04/01(金) 21:10:45.240884デフォルトの名無しさん
2011/04/01(金) 21:14:14.56罠を避ける方法を学ぶためだけに最低でもEffective C++を読む必要があるから。
0885デフォルトの名無しさん
2011/04/01(金) 21:20:35.371から作った言語ではなくCの上位互換を強く意識しているために
落とし穴だらけになった
しかも完全上位互換じゃないし
対極的な言語としてはC#があり、JavaをSunに訴えられたM$が
リベンジを誓って1から作ったために言語としてはほぼ完璧な構造を持つ
対してJavaは建て増しに次ぐ建て増しで次第にガタガタに崩れて来ている
0886デフォルトの名無しさん
2011/04/01(金) 21:57:28.210887デフォルトの名無しさん
2011/04/01(金) 22:29:07.810888デフォルトの名無しさん
2011/04/01(金) 23:45:59.75Cはもうファーム用言語だな
俺はC++はよく分からないけど、機会あれば使ってみたいよ
0889デフォルトの名無しさん
2011/04/01(金) 23:50:38.76で、ファームって何?
0890デフォルトの名無しさん
2011/04/01(金) 23:53:52.30難しかったら「難しいから採用されないんだ」って言えるでしょ
0891デフォルトの名無しさん
2011/04/01(金) 23:54:18.060892デフォルトの名無しさん
2011/04/02(土) 01:05:31.500893デフォルトの名無しさん
2011/04/02(土) 01:36:12.400894デフォルトの名無しさん
2011/04/02(土) 01:41:38.92後なんかある?
0895デフォルトの名無しさん
2011/04/02(土) 02:46:00.870896デフォルトの名無しさん
2011/04/02(土) 03:25:58.050897デフォルトの名無しさん
2011/04/02(土) 07:26:41.090898デフォルトの名無しさん
2011/04/02(土) 08:56:36.330899デフォルトの名無しさん
2011/04/02(土) 21:58:37.890900デフォルトの名無しさん
2011/04/02(土) 23:48:20.790901デフォルトの名無しさん
2011/04/02(土) 23:55:43.85Linux, *BSD, Apache, MySQL, Perl, Python, Ruby, Blender, Quake III, etc.
この辺りは全部 C かな。中で一部 C++ を使っている物もあるけど。
>>897
Mac OS X の Kernel 部分の事を言いたいなら、実装言語は C でしょ。
0902デフォルトの名無しさん
2011/04/03(日) 02:49:31.40やたら C ということにしたいようだが、どの部分のこと言ってんの?
0903デフォルトの名無しさん
2011/04/03(日) 03:02:01.53どの部分って xnu に決まってるだろ・・・
http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/
http://www.opensource.apple.com/tarballs/xnu/xnu-1504.9.37.tar.gz
0904デフォルトの名無しさん
2011/04/03(日) 03:04:59.11金融系は OCaml とか何でもアリだからな
0905デフォルトの名無しさん
2011/04/03(日) 03:05:29.40>>904 は >>896 宛ね。
0906デフォルトの名無しさん
2011/04/03(日) 10:18:57.24C++使いは低能じゃなくて無能なんですね
0907デフォルトの名無しさん
2011/04/03(日) 10:53:26.43そういうお前は無脳な
0908デフォルトの名無しさん
2011/04/03(日) 13:04:41.84Darwin というか MACH/BSD は C と ASM だぞ
0909デフォルトの名無しさん
2011/04/03(日) 23:48:13.42何故ろくに知りもしないことに口を挟むのか
0910デフォルトの名無しさん
2011/04/04(月) 17:21:38.82C++ 汚染水溜まりに新聞紙
0911デフォルトの名無しさん
2011/04/04(月) 20:43:44.370912デフォルトの名無しさん
2011/04/04(月) 21:20:55.960913デフォルトの名無しさん
2011/04/05(火) 12:53:29.930914デフォルトの名無しさん
2011/04/05(火) 13:13:03.07>Java/C++プログラムで細かいクラスがたくさんあると
>把握しきれない」という自分の能力の限界の暴露に過ぎないのです
歳とったら無理って結論だろ
0915デフォルトの名無しさん
2011/04/05(火) 13:23:11.73低能には謙遜とか皮肉って理解できないのかな?
0916デフォルトの名無しさん
2011/04/07(木) 12:09:12.80> WebKit, Firefox
に加え Chromium も C++ か。
0917デフォルトの名無しさん
2011/04/07(木) 17:24:26.480918デフォルトの名無しさん
2011/04/07(木) 18:39:47.83HTMLパーサーのような巨大なシステムとしての構造を書くなら、C++みたいにクラスを使える言語の方が整理しやすくて作りやすいと思う。
ブラウザーがC++で、FFmpegがCなんてのは、まさに象徴的な気がする。
0919デフォルトの名無しさん
2011/04/07(木) 20:57:05.180920デフォルトの名無しさん
2011/04/07(木) 21:34:21.52>Chromium も C++ か。
Chromium は超巨大プロジェクトだから何とも言えない。
C++ が多いのは WebKit や V8 がベースだから当たり前。
% du -sh chromium
3.6G chromium
% find chromium -type f | wc -l
237588
% find . -name '*.cpp' | wc -l
8091
% find . -name '*.cc' | wc -l
7687
% find . -name '*.c' | wc -l
5891
% find . -name '*.py' | wc -l
5174
% find . -name '*.js' | wc -l
4220
% find . -name '*.idl' | wc -l
2427
% find . -name '*.mm' | wc -l
1138
% find . -name '*.m' | wc -l
303
0921デフォルトの名無しさん
2011/04/07(木) 21:42:26.75% du -sh native_client
264M native_client
% find native_client -name '*.c' | wc -l
504
% find native_client -name '*.cc' | wc -l
260
% find native_client -name '*.py' | wc -l
113
0922デフォルトの名無しさん
2011/04/07(木) 22:08:39.97各プロジェクトで実際にどの程度C++が使われてるかなんて知らないよ
0923デフォルトの名無しさん
2011/04/08(金) 00:11:15.88各プロジェクトで実際にどの程度Cが使われてるか完全に把握してるよ
0924デフォルトの名無しさん
2011/04/08(金) 02:46:06.84>フーリエ変換や物理挙動のコアライブラリーみたいな数式的なものを書くときはCで十分だし、むしろ巨大関数として一気に書いてしまった方が作りやすいってのもある。
これもC++で書いた方がいろいろメリットがあると思うが。
巨大関数のすべての変数を冒頭で宣言するのは面倒。
面倒なだけならいいが、最初に宣言して後から初期値を設定しなくてはいけない状況では
意味的に定数でも変数にしなくてはいけないから、バグの温床になる。
const変数をif文やfor文の中で宣言できないのは、正直つらい。
0925デフォルトの名無しさん
2011/04/08(金) 07:02:01.03あと、C99では標準でrestrictがあるのでasm無しで最適化効かせられる。
0926デフォルトの名無しさん
2011/04/08(金) 08:33:25.34>巨大関数のすべての変数を冒頭で宣言するのは面倒。
規格上も、10年以上前からそんな事をする必要は無いんだが。
0927デフォルトの名無しさん
2011/04/08(金) 08:49:15.00で、そんな奴はC++で書かせてもやっぱり関数先頭で全部宣言してしまう。
共通処理クラスをわざとそれでは使いにくいように設計してやったら、
そのクラスの宣言だけ途中に書いて、それ以外はやっぱり関数先頭で宣言していた。
存外、>924も実はその口かも知れず。
0928デフォルトの名無しさん
2011/04/08(金) 11:04:52.340929デフォルトの名無しさん
2011/04/08(金) 21:07:44.16プログラムで表現する場合はCよりC++の方が遥かに
適していると思うが。
0930デフォルトの名無しさん
2011/04/09(土) 00:36:06.42>最初に宣言して後から初期値を設定しなくてはいけない状況では
初期値を設定出来る所で宣言すれば良いじゃん
いつの時代の人ですか?
0931デフォルトの名無しさん
2011/04/09(土) 07:24:32.15Simulaの後継であるC++はオブジェクト指向的な
シミュレーションがCより得意と言いたいのかな?
それはそうかもね。
でもさ、計算速度が必要なときは
きちんと効率よく解ける方程式を導出して解くので
オブジェクト指向とか関係ないんだよね。
計算速度が必要ないならC++である必要も無いしね。
0932デフォルトの名無しさん
2011/04/09(土) 08:15:36.66こういうレベルの理解度でCの代わりにC++使ってる人多いんだろうなぁ
0933デフォルトの名無しさん
2011/04/09(土) 10:33:27.50「Cで十分」という説明はCのメリットがありませんと言ってる
ようなものだ。
C++使いからしたら、敢えて機能制限の多いCを選ぶ必要は無い
0934デフォルトの名無しさん
2011/04/09(土) 11:05:53.74言ってるような物だと無理矢理断定しても、言ってない物は言ってないんだぜ
0935デフォルトの名無しさん
2011/04/09(土) 11:08:00.13そんなんだと、断定口調で書き込んだ所で説得力は無いよね
0936デフォルトの名無しさん
2011/04/09(土) 11:28:06.09知障ばかりなのね
0937デフォルトの名無しさん
2011/04/09(土) 11:31:53.910938デフォルトの名無しさん
2011/04/09(土) 11:32:40.24C++はソースの可読性がクソだし、規格をちゃんと把握するのも困難だ。
ソースや規格を確認しないような人だからC++を好むのかもしれん。
0939デフォルトの名無しさん
2011/04/09(土) 11:39:35.74C使いが、Cが必要だと理由を言わず、ただ単にC++が不要だと言っている。
これでは、C++を使えない自分に対する言い訳を言っているようにしか聞こえない。
もしくは10年、20年以上前の記憶でしか、C++を見ていないとか。
いつの時代の人ですか?
0940デフォルトの名無しさん
2011/04/09(土) 11:42:11.14>いつの時代の人ですか?
何だ気にしてたのかw
皮肉は事実に裏付けされていないと意味ないよ。
0941デフォルトの名無しさん
2011/04/09(土) 11:44:00.300942デフォルトの名無しさん
2011/04/09(土) 11:45:23.17どう考えたのかを具体的に書かないとネ
0943デフォルトの名無しさん
2011/04/09(土) 11:50:06.22Perl と C++ は可読性が低い言語の二大巨頭だな
一時期大きな人気を獲得して、その後、後発に追い抜かれたという点でも似ている
0944デフォルトの名無しさん
2011/04/09(土) 11:53:25.00C++はクラスなどを使うことで各機能を分割して作成できる。
それに標準機能がC言語より多いからコードの短縮にもなる。
0945デフォルトの名無しさん
2011/04/09(土) 11:55:07.31C++ の全ての機能を使う必要はないのよ
0946デフォルトの名無しさん
2011/04/09(土) 11:55:25.99C が悪いんじゃなくて、ただ C を知らないというだけの話だが
0947デフォルトの名無しさん
2011/04/09(土) 11:56:55.93C++ で C っぽく書くなら C で書いた方がマシ。
C++ の機能を充分に使えず、C とも互換性が無いコードなんて誰も読みたくないわ。
0948デフォルトの名無しさん
2011/04/09(土) 12:08:44.25処理の流れや構造を把握しにくく、修正や機能の追加が困難なプログラム。
麺が複雑に絡み合い数本の麺を引っ張り出そうとしても全体がついてくる、スパゲッティに例えたのがこの言葉である。
http://e-words.jp/w/E382B9E38391E382B2E38383E38386E382A3E38397E383ADE382B0E383A9E383A0.html
オブジェクト指向プログラミング - Wikipedia
背景
オブジェクト指向という考え方が生まれた背景には大規模なソフトウェアが書かれるようになってきたということが挙げられる。
コードが複雑化してゆくにつれソフトウェア開発コストが上昇し1960年代にはsoftware crisisといったようなことも危惧されるようになってきた。
そこでソフトウェアの再利用、部品化といったようなことを意識した仕組みの開発や開発工程の体系化などが行われるようになった。
このような流れの中で、プログラムコードについては手続きや関数といった仕組みを基礎に整理され、
その構成単位を部品化を推進する仕組みが提唱され構造化プログラミングとしてまとめあげられた。
しかしデータについては限られた種類の基本データ型の値という低レベルの抽象化から抜け出せなかった。
そこでインスタンスを整理して管理する仕組み(例えばクラスとその継承など)まで
考慮して生まれたのがオブジェクトという概念である。
C++の創始者は論理美の追求よりも現用としての実用性を重視した。
そのためC++の再定義した「オブジェクト指向」はこれらの問題を全てクリアにし、
既存言語の拡張としてオブジェクト指向機能を実装できることでブレイクスルーを迎え急速に普及する。
0949デフォルトの名無しさん
2011/04/09(土) 12:11:01.05可読性、保守性が落ちたらC++を使う意味が無い。
可読性が落ちるっていうやつは、上手く使えてないだけだろ。
0950デフォルトの名無しさん
2011/04/09(土) 12:15:17.72いとも簡単に汚いコードを書いてのける物だぜ。
オブジェクト指向に万能感を抱く時代は90年代で終わりを告げたと思っていたが・・・
0951デフォルトの名無しさん
2011/04/09(土) 12:17:53.44もっと扱い易くて可読性を損なわない言語があるから
わざわざ C++ を採用する理由も無いんだろう
0952デフォルトの名無しさん
2011/04/09(土) 12:20:52.04今更、素の C なんかで書きたくないわ。
C との互換性を気にしなきゃならんとか理由があるなら別だけどね。
0953デフォルトの名無しさん
2011/04/09(土) 12:30:08.48中途半端な C++ で書く方が理解に苦しむわ。
Better C は絵に描いた餅。
0954デフォルトの名無しさん
2011/04/09(土) 12:37:16.99今更、C++ というのも十分微妙なんだがな・・・
0955デフォルトの名無しさん
2011/04/09(土) 12:38:17.95C99オススメ。食わず嫌いなら。
Cの構造体やファイルスコープなどのモジュール化機能は原始的だけど、
LinuxやFFmpegくらいの規模のプログラムなら問題なく組めるわけで、
しかもコードスペニットが局所的コンテキストにのみ依存する
シンプルな構文のため(書き手によっては)可読性も高い。
まあ、巨大なプロジェクトだとC単体じゃ辛いけど、
その規模だと他言語と組み合わせたらいいと思うわけよ。
0956デフォルトの名無しさん
2011/04/09(土) 12:41:47.18CもC++もイマイチだが。CよりかC++はわかりやすいってだけ。
他言語との比較はしてないんだろ。
0957デフォルトの名無しさん
2011/04/09(土) 13:24:40.720958デフォルトの名無しさん
2011/04/09(土) 13:37:03.95ポインタのポインタ使わずに参照やクラスで置き換えられること。
スパゲッティコード減らせること。
0959デフォルトの名無しさん
2011/04/09(土) 14:22:46.32Better C 悪くないけどなあ。どこまでが Better C なのかは微妙なとこだけど。
>>954
それは同感。
>>955
プレステの頃は C でも書いたけどねえ。 C はもうやだ。
まあ結局何を作るかによるんだろうなあ。
みんな何作ってるのよ?
おいらはコンシューマゲームとか。
ツール類は Python とかだねー。
0960デフォルトの名無しさん
2011/04/09(土) 14:41:08.30便利な機能を積み上げて行ったら、全体として汚くなってしまったのが C++ だと思うわ
スパゲッティコードは C++ でも量産可能
0961デフォルトの名無しさん
2011/04/09(土) 14:49:53.07STLの構想が先にあり、実現のためにC++が作られた。
0962デフォルトの名無しさん
2011/04/09(土) 14:59:38.83STLのアーキテクチャの多くはアレクサンドル・ステパノフによって作られた。
1979年に彼はジェネリックプログラミングの初期アイデアを練り始めソフトウェア開発に革命をもたらす可能性を探究し始めた。
ジェネリックプログラミングの一部は1971年にデイビッド・マッサーにより開発されて提唱されていたが特定のソフトウェア開発の分野に限定されたものであった。
ステパノフはジェネリックプログラミングの大きな可能性に気づきゼネラル・エレクトリックの仲間たちに、ジェネリックプログラミングがソフトウェア開発の広範囲に渡る基礎として研究されるべきだということを説得した。
当時はジェネリックプログラミングを実際にサポートしているプログラミング言語がまだなかった。
Standard Template Library - Wikipedia
0963デフォルトの名無しさん
2011/04/09(土) 15:22:52.660964デフォルトの名無しさん
2011/04/09(土) 17:26:37.18C++の良さも自分じゃ説明できない(理由の無い断定のみ)から
Wikipediaのコピペくらいしか出来ないのさ
0965デフォルトの名無しさん
2011/04/09(土) 17:32:37.88スパゲティコードを減らせるどころか、
言語仕様がスパゲティになってるだろwww
0966デフォルトの名無しさん
2011/04/09(土) 18:11:17.350967デフォルトの名無しさん
2011/04/09(土) 23:53:08.93> C使いが、Cが必要だと理由を言わず、ただ単にC++が不要だと言っている。
C はシステムプログラミングや他言語の拡張に有用であり、必要。
C++でも同じことは出来るが、コード片が持つ意味に影響を与える範囲が
(比較的限定されてるCに比べ)あまりにも広く、そのコード片の持つ意味を理解するのに
大量のコードに目を通す必要があり、端的に言って可読性が低い。
だからC++は不要。
> これでは、C++を使えない自分に対する言い訳を言っているようにしか聞こえない。
他者が書いてるものを理解しようとしないから、自分が聞きたいようにしか聞こえないんだよ。
0968デフォルトの名無しさん
2011/04/10(日) 01:15:12.65ネタだと思うけど、なんかもう病的だよな。
0969デフォルトの名無しさん
2011/04/10(日) 02:57:30.67>Better C 悪くないけどなあ。
貴方はどんな時に Better C を使うの?
一人で書くなら気兼ねせずに C++ の機能を余す所無く使えば良いでしょ。
チームで書くなら C++ 使いにとっても C 使いにとってもストレスフルな
コーディングルールを採用する事は疑問だなあ。
そもそも、どこで線引きをするかで余計な調整作業が発生するし。
嫌がる C 使いに無理矢理 C++ を押し付ける時くらいしか役に立たない
気がする。
0970デフォルトの名無しさん
2011/04/10(日) 08:20:41.95不満を承知でもその条件下で最良のコーディングができるのが、良いプログラマだと思う。
こんだけ、グダグダ言われるようだと、>>967は仕事で使いたくないな。
たとえ、すごいC使いだとしても。
ま、そもそも採用しないけどね。
0971デフォルトの名無しさん
2011/04/10(日) 09:38:59.52少なくとも、このスレのC++ PGはまともにCは書けないよ。
C++を書かせてもリソースリーク起きまくりのコード書くよ。
0972デフォルトの名無しさん
2011/04/10(日) 14:24:46.590973デフォルトの名無しさん
2011/04/10(日) 15:15:26.41まあ、どこまでが Better C なのかってのが微妙なとこなんだけど。
> 一人で書くなら気兼ねせずに C++ の機能を余す所無く使えば良いでしょ。
そこまではする必要がないというか、そこまでできる環境なら LL に逃げられたりするし、
そこまですると、それこそ C++ 否定派の人が言うように、ややこしい問題が発生しがちだから。
> チームで書くなら C++ 使いにとっても C 使いにとってもストレスフルな
幸いなことに C 使いは切り捨てられるので。
それと、あまり潤沢な環境でなかったりもすると、落とし所が大体見えてたりするから、
そんなに厳密にコーディングルールという形で強制しないで済む場合も多い。
もちろん阿呆が要ると破綻するけど、それはそういう人間が入った時点で負けで、
どんなに決め事をしてもおかしくなるから。
(とはいえ決まりごとが無くていいわけではないけど)
まあ、ちょっと特殊な環境なのかもしれない。
0974デフォルトの名無しさん
2011/04/10(日) 17:17:10.56でも、何で嫌いなのかは良く分からんなー。
多分、Cには無いがC++にある機能の何かを必要としてるんだよね?
あまり厳密なコーディング規約は必要なかったみたいだけど、
C++のこの機能だけは必須、みたいなのってあるの?
ちなみに当方、数値計算を生業にしてるためrestrict修飾子にはお世話になってます。
これで新規にFortranを書くことは無くなったから。
あとC++0xの右辺値参照には注目してる。これがあれば行列演算メインの計算はC++でやるかも。
0975デフォルトの名無しさん
2011/04/10(日) 18:27:28.78>幸いなことに C 使いは切り捨てられるので。
それは Better C じゃなくて、単に制限を強めた C++ でしょ。
C PG からしたら何にも Better じゃない。
わざわざ C の名前を騙る理由がよく分からんなあ。
0976デフォルトの名無しさん
2011/04/10(日) 18:35:35.70(そりゃ class が無くても書けるけど、それ言ったらアセンブラだっていいわけだし)
template もマクロよりマトモな面は多々あるし。
(酷い面も多々あるけど)
C++ は、機能もありますが、現実的な現場の共通認識として必要なのかも。
だから、このあたりは実際に作ってるものによるんだと思います。
C の資産が膨大に残ってて、 C が主流の現場で C++ 使うんだーなんて
言い張るのは、そりゃ阿呆というか不幸だと思いますし。
右辺値参照はどうなんでしょうかね。ちゃんと調べてないし詳しくないので、あれですが、
STL なんかはパフォーマンス的な底上げにはなるのでしょうけど、
行列演算が速くなったりするんでしょうか。
小さな行列演算が書きやすく速くなるならいいなあ。
0977デフォルトの名無しさん
2011/04/10(日) 18:57:08.170978デフォルトの名無しさん
2011/04/10(日) 20:22:16.06行列演算 C=A+B を(オペレータオーバーロードで)計算したとき、これまでは
(1)テンポラリ行列Dを確保してA+Bの結果を格納(2)Cの領域解放(3)DをCへコピー(4)Dを解放
って無駄な処理をしてたけど、右辺値参照があればDとCのswapのような処理が書けて
(3)(4)のような無駄が無くなるという話(間違って理解してなければ)。
一度確保したメモリを使い回すような貧乏臭い処理も必要なんで、
これまで関数でやってた計算の全てをオペレータオーバーロードで置き換えられないだろうけど、
ちょっと期待しているわけです。
0979デフォルトの名無しさん
2011/04/10(日) 20:49:42.59アプリを書けと言われたら納得するのかしらん。
0980デフォルトの名無しさん
2011/04/11(月) 09:41:42.62なんだか主張がふわふわしている。
おそらくCが嫌いなんじゃなくて、C使いが嫌いなんだな。
C使いを排除するための方便としてのC++。
0981デフォルトの名無しさん
2011/04/11(月) 22:39:21.262. C があれば C++ は必要無い事
3. C++ でも C でもやり辛い事
1 に該当する分野ってそんなに無いからなあ...
最近は 3 が多い希ガス.
C が無くなれば 2 に該当する分野は C++ で
独占出来るから、Better C とか色々考える罠.
そんなのが上手く行くとは思えんけど...
0982デフォルトの名無しさん
2011/04/11(月) 23:14:27.05デバイスドライバーとか埋め込み系はC/C++の独壇場だろ。
C/C++はもはや特殊用途限定の言語。
今時アプリケーションをCで書くとか時代錯誤な認識でいるなら
出家した方がいい。
0983デフォルトの名無しさん
2011/04/11(月) 23:49:32.51アプリケーションは今でもCだよ。
でも、これも一種の埋め込み系かな。
0984デフォルトの名無しさん
2011/04/11(月) 23:52:41.12君は Haiku OS でも使ってるのかな?
それともユーザモードも入れての話?
カーネルモジュールは C の独壇場だよ。C++ の出番は無し。
頑張っても IOKit の Embedded C++ 止まり。
Embedded だから、テンプレートも名前空間も使えない。
0985デフォルトの名無しさん
2011/04/12(火) 00:31:14.45どうせ同じなら表現力に無駄な投資をしないC
0986デフォルトの名無しさん
2011/04/12(火) 14:55:08.410987デフォルトの名無しさん
2011/04/12(火) 15:16:13.33【結構迷う】C vs. C++ 2行目【どっちで行こうか】
http://hibari.2ch.net/test/read.cgi/tech/1302588918/
レス数が950を超えています。1000を超えると書き込みができなくなります。