1 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:37:43 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。
326 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 13:52:21 ] >>325 スタックフレームとか実装に立ち入った話はしてない。言語概念上の型が違うんだよ。
327 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 13:53:59 ] >>326 力いっぱいデタラメぶちかまさない
328 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 13:58:42 ] 知識不足は許容できるが嘘吐きになってはイカンぜよ
329 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 14:03:56 ] >>327-328 気持ちはわかる。きっとみんなこれらは同じものとして使ってるだろうし、 動作も問題ないだろうさ。 でも規格ではエラーにならないとダメなんだよ。はっきり書いてあるから。 7.5 "Linkage specifications" p1 より > ... Two function types with different language linkages are distinct types even > if they are otherwise identical. gcc でもバグ扱いだ。 gcc.gnu.org/bugzilla/show_bug.cgi?id=2316
330 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 14:06:37 ] >>329 自分を嘘と虚栄で塗り固めるような真似はやめた方がいい、どこに突っ込み入っているのかすら理解できていないだろ。
331 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 14:10:44 ] 静的メンバ関数はextern "C++"ではない
332 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 14:11:10 ] 328は327に宛てたもんだと俺は思った、どうでもいいけど。
333 名前:329 mailto:sage [2008/03/27(木) 14:11:40 ] >>330 ごめん。どこに突っ込み入っているのかすら理解できてない。 どこが嘘になってるの?
334 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 14:16:32 ] >>331 何を根拠にそんなこと言うのか知らないけど、じゃぁ静的メンバ関数の language linkage は "C++" 以外の何になるのさ?
335 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 16:56:26 ] 虚言癖というか妄想癖というか・・・なんかもう病気だね(汗
336 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 17:04:34 ] >>334 静的メンバ関数のリンケージは内部リンケージで その根拠は外部に公開されないから 逆にextern "C++"と同じという根拠は?
337 名前:デフォルトの名無しさん [2008/03/27(木) 17:05:02 ] もうv(^・^)vの人はいないの?
338 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 17:20:53 ] ちゃんと勉強しろ、そんな高度な話題じゃねぇよ
339 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 18:55:41 ] コンストラクタの中で 配列宣言しているオブジェクトの コンストラクタ引数を設定するにはどうしたらいいですか?
340 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 19:03:37 ] class Test{ Test0 objects[10]; ... }; Test::Test() :objects[0]( 10 ) ,objects[1]( 8 ) ... { } こんなかんじをやりたいのです。 もちろん、これではエラーです
341 名前:デフォルトの名無しさん [2008/03/27(木) 20:36:48 ] >>339 できないよ。
342 名前:デフォルトの名無しさん [2008/03/27(木) 20:51:07 ] 解答を待っているのかもしれないが、本当にできないから。 www.geocities.jp/ky_webid/cpp/language/012.html
343 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 20:57:51 ] どうしてもそれっぽいことがやりたいなら vector<Test>にひとつひとつpush_back()するか ポインタの配列にしてひとつひとつnewすればいいんでないの
344 名前:デフォルトの名無しさん [2008/03/27(木) 21:55:56 ] VC++6で for(int i=0; i<10; i++){ ... } for(int i=0; i<10; i++){ ... } って書いたら iの再定義っておこられた 拡張子cppになってるのに
345 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 21:57:25 ] 仕様です
346 名前:デフォルトの名無しさん [2008/03/27(木) 21:58:46 ] 1998年発売のソフトやもん。
347 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 21:59:23 ] >>344 びっくりするくらいみんな知ってる。 規格準拠していないんだから何も問題ない。
348 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:01:35 ] >>344 #define for if(0); else for 魔法のおまじない
349 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:01:59 ] 当時は準拠してたんだよ
350 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:03:21 ] まだ規格もなかったのに何に準拠してたというのか。
351 名前:デフォルトの名無しさん [2008/03/27(木) 22:04:00 ] 常識。
352 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:29:04 ] >324,329 だいたい、「関数ポインタ型」それ自体にはリンケージなんか無いだろ。 それともこーゆーコードが通るコンパイラでもあるのかっつーの。 typedef static void (*hoge)(); typedef extern void (*foo)(); typedef extern "C" void (*var)();
353 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:36:23 ] typedef void (*__stdcall type)(); こういうのならたまにやる。
354 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:36:46 ] それはリンケージじゃなくて呼び出し規約
355 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:48:31 ] >>350 ARM、ISOのドラフト
356 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:49:53 ] >>355 >>344 なていたらくでか
357 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:58:27 ] >>356 forの中で定義した変数の有効範囲が 直後のループ本体に限られるようになったのは 結構遅かったのでは?D&Eでも軽く触れられていたし。 それに加え過去の互換性のためVC6はあれがデフォルトになったんだと思う。
358 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 23:27:37 ] 昔の人が考えた仕様には、頭おかしいだろうってのがそれなりに有るからね。
359 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 23:47:27 ] 初期のコンパイラの実装の都合もあったんじゃないかな? 最近のコンパイラで、forの変数の有効範囲が限られるようになってるのに最近気づいて思わずGJと叫んだ。
360 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:10:34 ] >>357 まあ 1998 年と言えば規格が出る年だしな。 開発期間とか考えると多少前の仕様に準じようとしてたと考えるのが妥当だけど、 その時期ならドラフトとはいえかなりな部分まで練られてると思うんだけどな。 まあ、想像でしかないので本当にギリギリになって入れられた仕様なのかもしんないけど。 VC6 はテンプレートまわりがバグ持ちすぎてかなり酷いが、 テンプレートも遅くに入った仕様だからな・・・。 new がデフォで bad_alloc 投げないとか、とにかく色々と酷い上に、 しばらく次のコンパイラが出なかったという・・・。
361 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:18:58 ] 未だに古いライブラリとかで使わないといけないことが結構あるからねぇ VS2005から入った俺としては結構苦痛 まあでもテンプレートさえなければインテリセンス反映が早いのはよい
362 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:36:24 ] VC++6.0は当時の状況を考えればしょうがないと思う 問題なのは次のコンパイラがさっさと出なかった事 お陰で変に普及しちまって、このスレでもVC++6.0でコンパイルできません的な質問が絶えない
363 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:38:12 ] 全てはMSが次期製品を確実に買ってくれる為に図った陰謀。
364 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:53:13 ] MSの事情的にはむしろ逆のような? 過去のシステムヘッダに, for で宣言した変数が その後も生きることに依存したコードがあったっていう……
365 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:56:00 ] #define for if(0) else for のおまじないと使ったあとでATLをincludeすると 怒られるちゅーか
366 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:14:53 ] >>363 そして満を持して登場した 2002 が糞だったという罠。 そして 2003 で大きく改善されるという二重の罠。 アカデミックだと無料アップグレードできないという三重の罠。
367 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:16:50 ] #define for if(0); else for は色々やった後にやるとよろし。
368 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:55:57 ] ってかincludeする前にundefするだろ・・・
369 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 02:11:01 ] >>336 ,352 ややこしくて嫌になるが、内部とか外部とかがある「リンケージ」と "C" とか "C++" とかがある「言語リンケージ」("language linkage") とは 別物。 >324,329 が言ってるのは言語リンケージのほうなんで、話がまるで かみ合ってない。
370 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 03:12:43 ] 自信満々な>>336 が可哀想に見えてきちゃったよw 逆にextern "C++"と同じという根拠は?ってのが哀愁をソソル
371 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 03:26:11 ] >>336 素の「リンケージ」の話だとしてもおかしい。静的メンバ関数のリンケージは ほとんど外部リンケージになる。例外は関数内のクラスのメンバの場合とかね。
372 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 03:29:08 ] 静的メンバ関数が「外部に公開されない」ってのもおかしいな。 クラスの宣言されたスコープや、クラス内での private なり public なりに 従うだろ、常考。
373 名前:デフォルトの名無しさん [2008/03/28(金) 03:50:38 ] びやーんはもうC++なんか使っていないらしい。
374 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 05:40:45 ] ソースは?
375 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 07:19:26 ] 2ch
376 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 08:03:31 ] >>372 public, privateと内部リンケージ, 外部リンケージはまた別の話だ
377 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 08:07:53 ] もう何がなんだかわからないよママン
378 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 09:26:26 ] >>359 もともとがCへのトランスレータだった事を考えれば自然に合点が行くね。 for( int i = 0 ; .... ) { ... } 変換後 { int i ; for( i = 0 ; .... ) { ... } }
379 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 09:47:14 ] >>377 C++の仕様書を見ればいいと思うお
380 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 09:57:02 ] >>372 リンカなどの外部に公開され得るのはクラスであって内部リンケージであるメンバが同様に公開されているように見えるのは処理系の都合
381 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 11:33:58 ] >>380 クラスが外部リンケージを持つときに、メンバ関数が外部リンケージを持つかどうか は処理系依存だと言っているのならそれは違うよ
382 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 03:01:24 ] >>377 >329,324
383 名前:デフォルトの名無しさん [2008/03/30(日) 01:04:01 ] テンプレートをつかうと一気にコンパイル時間が10倍に?!
384 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 01:07:31 ] >>383 >>5
385 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 15:11:26 ] template使っても 型が1個と100個じゃ大違いだろ
386 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 15:17:08 ] このテンプレいつの間にか一つのレスにまとめられてたのかw
387 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 15:27:00 ] template <typename Questioner> int IsCompileTimeBecomeLongerByUsingTemplate() { return ENVIRONMENT_DEPENDENT; }
388 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 16:25:46 ] テンプレート無意味過ぎる
389 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 16:28:21 ] >>388 質問者に応じて別の回答をするように特殊化するんだよ。
390 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 16:36:16 ] template<> int IsCompileTimeBecomeLongerByUsingTemplate<教えて君>() { throw spoon(); }
391 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 16:59:30 ] 匙は投げられた。
392 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 17:30:09 ] the biggest news of the meeting was that we voted lambda functions and closures into C++0x. // Writing a collection to cout, in C++0x: for_each( w.begin(), w.end(), []( const Widget& w ) { cout << w << " "; } );
393 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 17:59:38 ] スレ違い
394 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 01:28:23 ] LRESULT CALLBACKの関数をCLASSに所属させるにはどうすればできますか?
395 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 01:37:29 ] static
396 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 02:07:44 ] >>394 web.archive.org/web/20070810174250/http://techtips.belution.com/ja/vc/0009/
397 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 05:36:51 ] RTTIについて質問です。 RTTIありでオブジェクトファイルを生成したいが 外部libなどがRTTIを含んでいない場合は 自分側もそれにあわせてRTTIなしで組まなければ成らないのでしょうか?
398 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 10:26:48 ] コンパイラオプションでRTTIを使うかどうかの設定の話なら、ケースバイケース。 自分が知るVC++では、外部のオブジェクトに対してtypeidやdynamic_castをしなければ、 自プログラムがRTTI有効でも、問題なくリンクして実行できる。 逆にそうでない処理系も世の中あるかもしれない。
399 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 12:28:13 ] >>397 リンクでエラーが出たらオプション変えればいいんじゃないか?
400 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 17:21:40 BE:1614463687-2BP(200)] www.borland.co.jp/cppbuilder/freecompiler/ が切れていてBorland C++ Compilerがダウンロードできないんだけど
401 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 17:25:43 ] >>400 普通にアクセスできるしスレ違いですさようなら
402 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 02:25:47 ] test
403 名前:397 mailto:sage [2008/04/01(火) 02:34:57 ] >>398 環境依存てことですかね〜。 >>399 vcとのクロス開発あたりだとエラーがでてしまうのです;; 根本的になにをやりたいかというと、 シリアライズ機能を自前で実装しようと考えていまして 実装の際にRTTIのtypeidを利用して組むとらくそうなのですが・・・ ない場合はMFCやwxWidgetのようなクラス毎にマクロを仕組んで 独自の機構を作るしかないのかなって悩んでしまって・・ ※boostのシリアライズという選択肢もありますが、boostが対応していない環境も考慮しました。
404 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 06:49:14 ] というか、例外・RTTI・CRTは、何も考えずに DLL超えとか、コンパイラ/オプションの違うlibを混ぜるとか するとハマるよ?
405 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 06:58:03 ] >>403 libのクラスをもう一度派生させたのを使ってみてはどうかな? 念のために聞くけど、そのlibをコンパイルしたコンパイラと使ってるコンパイラの種類とバージョンはあってる?
406 名前:397 mailto:sage [2008/04/02(水) 04:43:48 ] >404 こちらはそこを懸念してるんですが、出来上がったものを使うのは私ではないのでなんとも・・・ >405 バージョンのほうはあってますが、こちらでつくったモジュールがどのようなケースで使用されるか をすべて網羅するわけにはいかないので・・ 派生というかstubのようなものをproxyとして使用する感じでしょうか? なんというか、それなりの状況でも使用に耐えうるもの、となると 結局RTTIははずさなければならないのかな、と思いました。
407 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 05:08:21 ] これはひどい builder.japan.zdnet.com/sp/c-programming-language/story/0%2C3800083430%2C20370255%2C00.htm
408 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 06:12:08 ] アクセスできるすべての識別子をリストアップするようなツールはないでしょうか。 class X { int i; public: int j; void f() {} }; というような場合に、 X X::j X::f() みたいに出力できるとうれしいのですが……。自分で字句解析するしかないかな。
409 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 06:47:39 ] doxygenいろいろ設定すれば出来るんじゃね?知らないけど。
410 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 08:45:55 ] >>407 他で散々話題になっているんだからここでまで張らなくていいよ。
411 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 00:16:30 ] >>408 doxygenで可能。privateは出てこない(設定で変えられるかも)
412 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 13:46:16 ] extern "C"しないで作られたshared libをcから呼ぶ方法ないでしょうか?
413 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 14:19:43 ] マングリング名がCの識別子として使えるならいけるかもね
414 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 14:49:22 ] C++ で C 用のラッパ関数作るといい。
415 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 16:47:51 ] >>412 .defファイルをがんがって作る
416 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 20:14:21 ] ふつーにdlopenするとか。呼び出し規約が同じとは限らないけどw
417 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 17:03:38 ] gccxmlを使った他言語(pythonなど)への インターフェース自動生成ツールが最近でてきてるけど ちょっと複雑なコードだと自動生成に失敗するみたいだ まだ発展途上のツールだから仕方ないのか gccxmlに渡すオプションを考えればうまくいくのか どうなんでしょうか?
418 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 20:28:21 ] Exceptional C++ を読んでて、疑問点が出てきましたので質問します。 P173〜181 にかけての auto_ptr についての説明中に、 T* pt( new T(1) ); auto_ptr<T> pt( new T ); auto_ptr<T> a( source() ); ↑どう見ても関数呼び出しに見えるのですが、 初期化子と解釈しないとどうも前後の説明から辻褄が合いません。 ですが、手元にある数冊の参考書を調べてもググってみても 以上のような構文は「コンストラクタ初期化リスト」以外には見あたりませんでした。 これは関数呼び出しなのでしょうか?それとも初期化子なのでしょうか? もし、初期化子だとしたら、このような構文が出てきたときに どのようにして見分けたら良いのでしょうか? また、関数呼び出しのように見える初期化子の使い方についても よろしくご教示願います。
419 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 20:34:16 ] まさか<T>の部分を聞いてるのか?
420 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 20:43:27 ] int i = 0; int i(0); 上のふたつは等価、という話なのかな? typename identifier(typename, typename, ...); // プロトタイプ宣言 typename identifier(arg1, arg2, ...); // 初期化 identifier(arg1, arg2, ...); // 関数呼び出し ただし、C++では、関数宣言として解析できるものは関数宣言と見なすので、 list<int> data(istream_iterator<int>(cin), istream_iterator<int>()); は(cinの内容で初期化したlistの宣言ではなく)関数宣言になる。
421 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 21:26:48 ] typedef typelist< char, 1, 2, 3, bool > LIST; なんてことは出来ないですかね?
422 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 21:32:31 ] boost::mpl, boost::tuple, boost::fusion辺り?
423 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 22:43:42 ] >>418 読むだけじゃなくていろいろ試してみたら?
424 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 23:49:20 ] classメンバを外部からリードオンリーに出来ませんか? 全部のメンバにゲッタを設定するのも面倒ですし
425 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 23:49:20 ] >>418 その本持ってるが、その部分に間違いはない。 auto_ptrのメンバ関数のインターフェース見れば疑問は無くなるはず。
426 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 00:19:52 ] >>424 面倒でも書く。