[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/14 14:02 / Filesize : 217 KB / Number-of Response : 865
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part71



1 名前:デフォルトの名無しさん [2009/07/18(土) 02:54:58 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part70
pc12.2ch.net/test/read.cgi/tech/1244942050/l50

754 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 01:11:25 ]
>>753
VC++の仕様。VC++は基本的に例外指定を無視する。
throw()も最適化のヒントになるだけ。
msdn.microsoft.com/en-us/library/wfa0edys.aspx

755 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 02:01:59 ]
C++ Coding Standards 第75項によると
「強制されない限り、自分の関数に例外仕様を書かないこと」と書いてありまっする。

756 名前:753 mailto:sage [2009/08/22(土) 06:07:01 ]
>>754, 755
どうもありがとうございました!
すっきりしました。

757 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 12:00:03 ]
>>753
以前vc9(betaだったかも)でいろいろ試したときは
throw()つきの関数内で例外を投げるコードをreleaseビルドしたバイナリを実行したときは異常終了したと思う
嘘だったらごめん

758 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 14:09:05 ]
>>755
その理由は?
その関数が投げる例外が正体不明になったら普通困らないかな?


759 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 14:48:54 ]
>>758
まずコストとして、
try-catchブロックが挿入される
でそれが最適化の妨害をする
違反した際はunexpected_handlerに飛ぶだけになって、
指定しなかった場合において得られる可能性のある例外の情報は失われる

得られるものは動的なチェックだけ、
それも例外仕様に違反したら精々「違反した」だけ言って落ちるだけの貧相なもの

備考として、
テンプレートが関わるとどんな例外が来るかは定義時点では決定不能なので
適切な例外のリストを作ることは無理

こういう性質のもので関数が投げる例外が明確になる?
使う価値あると思う?

760 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 15:29:34 ]
それってthrow()も駄目なのか?
まぁ別に大抵は書く必要も無いけどなthrow()なんて

761 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 15:59:06 ]
throw()だけは価値がある場合もあるかもしれない、俺は書かないけどね

と書いてある

762 名前:753 mailto:sage [2009/08/22(土) 16:17:01 ]
>>757
IDEを起動してreleaseで実行したところ異常終了しました。
違いがよく分かりませんが、debugにすると例外をキャッチしました。



763 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 16:52:10 ]
デフォルトだと例外仕様違反するとunexpected()->terminate()->abort()が呼ばれることになってるから
異常終了するのが正常

764 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 18:15:05 ]
throw(hoge)って書いても関数仕様変更すると広域に波及して変更が大変。労力に見合ったメリットってない気がする。
ただthrow()は例外安全を示すメリットはあると思う。
そういえばデストラクタにthrow()はなんで書かないんだろうか?


765 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 18:29:39 ]
アホなコンパイラがtryブロック挿入する可能性があるから

766 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 19:09:44 ]
例外投げない保証は有用なのにthrow()がクソすぎるから
C++0xでnoexceptというのを型システムに組み込もうぜという話がある

767 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 19:15:56 ]
allocator とか auto_ptr とか vector<bool> とか
どんどんゴミがたまっていきますね^^

768 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 19:54:45 ]
おまえallocatorとauto_ptrなめんなよ

769 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:07:24 ]
まあauto_ptrはunique_ptrに移行してdeprecatedの予定ですけどね

770 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:12:35 ]
だがゴミではない。現行の規格では重要なものだ。

771 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:22:29 ]
同情の余地がないvector<bool>さんパネェ

772 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:32:02 ]
おまえら予約語なのにスルーされてるexportさんに謝れ



773 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:35:31 ]
export は普通に関数名とかに使いたいときがあって困るな。
キーワードは変に短縮されてるほうがいいんじゃないかとすら思うよ。
int とか const とか、まず自分で使う気にはならん。

774 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:38:16 ]
まともな実装がないexportを何故標準に入れたのか
標準化委員会は狂っているとしか思えない

775 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:39:05 ]
Comeauなめんな

776 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 22:00:12 ]
>>747
コールバックのための関数オブジェクトはこれ Derived オブジェクトの外に配るんですよね?
コールバックのための関数オブジェクトをメンバとして保持せずに
外に配るときに毎回作る + shared_ptr<Base> を downcast したものを持たせる,
で良いのでは?

777 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 23:56:22 ]
>>774
>435-436

時々で良いから、Comeauの事を思い出してあげて下さい

778 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 00:15:02 ]
>>766
確かに、constメンバ関数と同じように例外安全性の指定ができればいいなーと思ったことはある
C++ Sourceにテンプレートを使って実現する技法が投稿されてたけど、
あれを実践するのは正直ムリだと思った

779 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 00:34:50 ]
export の実装ってそんなに難しいかなあ。
オブジェクトファイルにソースコード埋め込んで、リンカからコンパイラ呼べば
済むと思うんだけど。

780 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 00:37:50 ]
>>779
よく分からんがそのお前の案とやらで
gccでexportが実装できたら
このスレの神プログラマとして
あがめられるな。

すくなくともテンプレには確実に入る。


781 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 01:14:34 ]
Comeauが3人年かけてexport実装して「もうやだ実装したくない」って禿に泣きついた話が
D&Eに載ってるから読むがいい

782 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 02:07:50 ]
その話に関してはどちらかというと Exceptional C++ Style を紹介したほうが良いような?



783 名前:デフォルトの名無しさん [2009/08/23(日) 03:08:52 ]
boost::functionの型引数について教えてください。
boost::function<int (int)>と宣言したときに、
どうやってシグネチャから戻り値の型と引数の型を取り出しているのでしょうか?


784 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 03:11:35 ]
template<typename T>
class function<T()>{/******/};
template<typename T, typename U>
class function<T(U)>{/******/};
template<typename T, typename U, typename V>
class function<T(U,V)>{/******/};
;
とかやってんじゃないの
知らないけど

785 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 03:38:58 ]
全力でソース追いかければ何とかなるんじゃね、知らんけど

786 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 07:35:23 ]
プログラミングエキスパートの皆さんの力が必要です。
どうかどうかツールを作っていただけないでしょうか。
もはや風前の灯状態のスレを救ってやってください。


yahooきっずで先生1位にして教育委員泣かそうぜwww
yutori7.2ch.net/test/read.cgi/news4vip/1250954051/

787 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 07:37:58 ]
  H S P で や れ

788 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 07:41:18 ]
本気で宣伝するならまとめページ作ってそこのリンク張るようにしてくれ
vipのスレのリンクなんか張ってもすぐdat落ちして見れなくなってしまうじゃないか
本当に見る人のこと考えてないんだな

789 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 11:33:48 ]
なんでさりげなく適切なアドバイスしてんだよw

>>783
>>784 をプリプロセッサで展開

790 名前:デフォルトの名無しさん [2009/08/23(日) 11:49:15 ]
valarray<T>::apply(T func(T))が,ふつうの関数しか受け付けないのですが,
関数オブジェクトを関数へのポインタに変換する関数って標準で用意されていますか?
つまりptr_funの逆関数はあるでしょうか?という質問です.
(自分で書けば一行ですが,メソッドが増えるのはよくないでしょう)

唐突ですが,よろしくお願いします.

791 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 13:25:24 ]
関数オブジェクトは関数の形をしてはいるものの、
それ自身のアドレスは持ってないから逆関数なんてないよ

792 名前:デフォルトの名無しさん [2009/08/23(日) 14:06:41 ]
なるほど.わかりやすい説明ありがとうございます.



793 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 15:47:50 ]
あれ、なんか調子悪い?

794 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 15:55:34 ]
c_functionとかいうのがあるんじゃなかったっけ
使ったことないけど

795 名前:デフォルトの名無しさん [2009/08/23(日) 16:17:05 ]
なるほど.これですね.
ttp://d.hatena.ne.jp/faith_and_brave/20090107/1231316933
まさに探していたものです.ありがとうございます!

が,Boostがないところで困りそうなのでやめときます.
valarray<T>もSTLライクな実装を加えてくれたらいいんだけど,
たぶん遅くなるのがイヤなんでしょうね.

796 名前:デフォルトの名無しさん [2009/08/23(日) 16:22:50 ]
うわっ.っていうかBoost VaultはBoostですらないんですね.
みなさん,ありがとうございました.

797 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 17:41:03 ]
>>796
Boost File Vault
Boostライブラリには入っていないけれど、その叩き台としたい、 というようなソースが転がっています。宝の山。^^

ってk.inaba氏が言ってた。

798 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 18:39:58 ]
valarrayを捨てる手もありそうだが

799 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 19:07:21 ]
>>790
valarray<T> y = x.apply(functor);としたいとして、
代わりにこれで我慢するのはだめ?
valarray<T> y(x.size());
std::transform(&x[0], &x[0] + x.size(), &y[0], functor);
valarrayも要素が連続している保証があるからこんなことして平気なはず。

800 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 20:45:54 ]
void関数ではその処理を終えて外のスコープに処理を戻したい場合は
return;
を記述しても良いということでしたが、
コンストラクタでも同様にreturn;を記述しても
良いのでしょうか?
記述した際にはそれより後ろにある処理は実行されないと期待してよろしいですか?

g++ではこの通りの動作でしたが、これがC++の仕様なのでしょうか。


801 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 22:20:28 ]
>800
大丈夫です.
蛇足ながら対応するであろう規格の文言は (6.6.3/2), (12.1/12)

802 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 23:33:21 ]
795があぼんなんだがまたfaith and braveでも貼ったのか?
いい加減にしろ。



803 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 02:10:07 ]
あぼんしてるなら触れるなよ
アホなのか?

804 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 04:28:47 ]
何のためのあぼーんなんだよなw

805 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 06:56:27 ]
何でFaith and Braveを貼っちゃいけないんですか?


806 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 06:59:04 ]
あぼーんであれスルーであれ、「お前の言葉は俺に効いてない」とアピールしたいあまり、
それを自分から言い出して、効いてるのがバレバレになる奴はたまに見かける。

たぶん居留守を使う時なんかも、居ないとアピールしたい一心で
ドアの向こうの人に「いま居ません」とか言っちゃうんだろう。

807 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 07:03:18 ]
「レス番飛んでるんだけど、何きたの? ねぇ、何きたの?」

「お前、NGに入れたから」
「あ、そう。でさぁ(ry」
「NGに入れたっつってんだろぉぉぉぉぉ!」

808 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 07:21:54 ]
言葉にしない間しか成立しない主張を、言葉にすることで殺しちゃうんだよな。
「誰もお前にレスする奴なんかいねえよ」とか。

自分の言葉で直接相手を悔しがらせたい衝動、みたいなもんが低脳にはあって、
それに勝てずに自爆してしまうんだろうか。

809 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 10:43:00 ]
あ…あんたのことなんて、何とも思ってないんだからねっ!

ってパターンも。

810 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 12:23:02 ]
あるあるwww

811 名前:デフォルトの名無しさん [2009/08/24(月) 17:06:45 ]
すみません.レス遅れました.

>>797
自分で適当にソースを改竄すればいいってことですね.

>>798
valarray<bool> って嬉しくないですか?
(vector<bool>のかわりに・・・)

>>799
コピーコストに目をつぶって,これでいこうと思います.

>>802-6
まったく議論が理解できないのですが,気分を害したのならすみません.
c_function って検索してもあまり出てこなかったので便利かと思って
リンク貼りました.他意はありません.

正直,あまり回答には期待していなかったのですが,
色々アイディアをもらえて感激しています.ありがとうございました.


812 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 21:22:59 ]
> 正直,あまり回答には期待していなかったのですが,
> 色々アイディアをもらえて感激しています.ありがとうございました.

この一言はどうして書いちゃったんだ。
 「お前らには大して期待してなかったけど
  いないよりは役に立ったな」
って意味にしかとれないんだけど。
実生活でこれいったらもう目も当てられない
ようなことになるぞ。



813 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 21:24:35 ]
それはお前の読解力がおかしいんじゃないのか

814 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 21:27:44 ]
>>813
いやおかしくないだろ。
別に悪意を持って読んだわけじゃないけど、
そう思った人は俺以外にもいるだろ。

815 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 21:35:51 ]
>>813
お前の読解力だと
> あまり回答には期待していなかった
これは「誰の回答に期待してなかった」んだと思う?


816 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 21:44:25 ]
書き方が悪いのは確かだな。
あまり反応してもらえるとは思わなかったが、と書くべき所。

817 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 21:48:21 ]
> あまり回答が付くことは期待していなかった
ならいいけど、
> あまり回答には期待していなかった=ろくな回答は無いと思っていた
と取られるとね。

まあ2chだから当然な予測かもしれないけど、
わざわざ書かなくても良かったかもね。

でもそこは噛みつく程でもない気がするが。

818 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 22:37:42 ]
むしろ>>812みたいなことをいちいち言っちゃう人のほうが
実社会では目も当てられない。

最近キレる人が増えたのは、
無礼な人が増えたよりも
他人の無礼をまったく許容できない赤ん坊のような糞人間が増えたからだって
どっかの新聞に書かれてたなぁ。

819 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 00:07:27 ]
で?

820 名前:デフォルトの名無しさん [2009/08/25(火) 01:29:40 ]
平謝りです.ごめんなさい.
> 実生活でこれいったらもう目も当てられない
この通りですね,弁解の余地はありません.
人によって2ちゃんねるとの付き合い方は違うのに,
それを無視した迂闊な発言でした.

感謝を伝えたかったのに・・・(涙)

821 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 01:56:50 ]
>人によって2ちゃんねるとの付き合い方は違うのに,
>それを無視した迂闊な発言でした.

別にダメじゃないが何というか、一言多いよね。
再帰的に迂闊。


822 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 02:27:13 ]
再帰的わろたうぇw



823 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 03:22:47 ]
要するに、回答内容に期待してなかったんじゃなくて、回答されることを期待して
なかったんだろ?

824 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 07:31:11 ]
>>821
そこ、俺も同じこと思った。
「俺の2chとの付き合い方を、迂闊どころか当然の顔をして無視し、踏みにじるお前ら」
って言いたいのかなと。

ある要素xを、自分より相手のほうがより強く持っていると判断した時に、
「xを持つことは悪いこと」という概念を大仰に押し立てて「xを持っててすみません」と平身低頭、
実はそういう皮肉攻撃、っていうデザインパターン。

825 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 08:01:05 ]
べつにいいんじゃね

826 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 08:23:48 ]
ぶっちゃけ何をそこまで絡んでるのか分からん

827 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 08:55:56 ]
世の中うぜえ奴ばっか

828 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 08:57:50 ]
ケンカ売る気なら最初から本気でかかってこいや
この偽善者め

とまあ、そんなことではないかと

829 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 10:43:38 ]
普通の
#ifndef HOGE
#define HOGE
本文
#endif
というインクルードガードがあるにも関わらず、
同時に
「コンパイラの種類がVCであるか、
もしそうならVCのバージョンを調べて
#pragma once」
としているものがあるのですが
これは意味があるのでしょうか?
どうして前者のインクルードガードだけでは不足なのでしょうか?

830 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 10:59:10 ]
>>829
微妙。

pc12.2ch.net/test/read.cgi/tech/1186262298/316
316 :306:2009/02/14(土) 04:46:01
>>313
マクロによるインクルードガードでは2回目もファイルを開いて少なくともインクルードガードを
読む必要がある。 #pragma once なら2回目以降ファイルを開かずにスキップするような実装が
考えられる。

そのため、インクルードガードを置いて移植性を持たせつつ、特定のコンパイラでの
コンパイル時間を短縮する目的で #pragma once を置くことが考えられる。

en.wikipedia.org/wiki/Pragma_once

831 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 11:04:55 ]
>>830
なるほど、
昔の冗長インクルードガードと同じですか。


ありがとうございます。

832 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 11:19:17 ]
尚、pragma onceの使える環境であればインクルードガードを省略できると言う考えは間違いである。



833 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 11:28:03 ]
え?
#pragma once を使える環境でインクルードガード書かないと何かマズイの?

834 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 11:31:28 ]
シンボリックリンクとかの関係でファイルの同一性がどうのこうのって問題?

835 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 11:35:23 ]
そりゃ昔のバギーな実装の問題だろ。

836 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 11:58:05 ]
滅多なことでは問題にならんからなぁ。 gcc3.4で解決されたって話もあるし。
それにVCとgccとで使えるから、ふつーのひとはもう何も考えずに#pragma onceしちゃっていいんじゃないかなぁ。

837 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 12:32:29 ]
同じ内容の別のファイルをインクルードするときにバッティングが発生するのを防止することができない。
インクルードガードなら、それができる。その点を無視していいのなら、prgama onceで充分。

838 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 12:48:41 ]
#pragma onceの問題点は非標準であるという一点に尽きる。
一々各コンパイラが対応しているかを調べるのは面倒。

ちなみに、上で#pragma onceの時のみに最適化される可能性があると書いてあるが
GCCではインクルードガードを使った場合に同様の最適化が効く。

839 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 14:43:19 ]
VC++2005なんだがDLLを配布したいんだけど
libとh同封しとけばVC6とかVC++2008とかの人でも使えるんかな?

840 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 14:52:59 ]
VC8で#pragma onceの効果があるかどうか調べたけど効果はあったよ

841 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 17:14:58 ]
毎回インクルードガード書くより#pragma onceに対応してるか調べた方が結局楽、と
いう考えもある
インクルードガードなら枯れてるから安心して使える、という考えもある
インクルードガードは記述時にヒューマンエラーが起きやすいから嫌だ、という考えも
ある
#pragma onceはコードではなくファイルに依存するので、シンボリックリンクなどで
別のパスからインクルードされた時の問題などがあって嫌だ、という考えもある

まぁ色々それぞれだな
#pragma onceにユニークな識別名を付けられるようなのが最初からあれば最強だった
んだろうが
ちなみに#pragma onceは対応している処理系は結構多い

842 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 17:31:40 ]
出来るだけ多くの環境でも使えるようにしたいもののヘッダは
インクルードガードをかけるしかない。
たとえ#pragma once の利点を十分承知し、対応する処理系が増えているとしても。

そして、その利点を生かすためには、#ifdefで切り分けて#pragma onceも併用するという
一見アホらしいコードを書くしかない。

例えば、MSのWin32処理系では、全て#pragma onceが使用可能だが
PSDK等のヘッダファイルは、他の処理系でも利用可能にするために
インクルードガードも併用されている。



843 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 18:18:21 ]
仮にビルドが通らない処理系があったとして、
それがpragma onceのせいってのは、ありえないと思うけどな。
それ以前のクリティカルな要因で止まるだろ常考。

844 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:10:39 ]
インクルードガードと#pragma onceが両方とも有効な状態って問題ある?

845 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:26:39 ]
インクルードガードはインクルードを読み込む順番が固定できるから、循環参照を防げるメリットがあるね。


846 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:27:08 ]
インクルードガードを矛、#pragma onceを盾だとして、
両方有効な状態だと、両手が砕けて紫龍が負ける
そんぐらいです。

847 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:31:11 ]
別に両方書いても、片方が仕事してもう片方が潰されるだけのこと
ライブラリ屋は「VC++なら#pragma onceが先に掛かるようにした方が軽いな」とか
有効な順番を意識するが、別にしなくてもコンパイルが僅かに遅いとかその程度

848 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:35:54 ]
>>844
問題ない。実際Boostの一部のヘッダではVCの場合に併用している。
>>842によるとWin32 APIのヘッダでも同様のことをやってるようだし。

849 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:42:13 ]
仕様として #include と書けば何度でもファイルを開いて展開するんだろうけど
その仕様が役に立つことってあるの?

850 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:50:48 ]
>>849 assert.h を #define NDEBUG して #include したり #under NDEBUG して #include したり。

851 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:51:29 ]
Boost.Preprocessorを使った再帰#includeでVariadic Template
みたいなことをするテクニックとか…

852 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:01:04 ]
#ifndef HOGE_H
#define HOGE_H
#if defined(_MSC_VER) && defined(__GNUC__) && ...
#pragma once
#endif

本文

#endif

結局こうするのがベストなのか
めんどくせーな



853 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:04:36 ]
>>852
それじゃどんなコンパイラでも#pragma onceが使われないぞw

854 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:17:23 ]
いや、
VC++でコンパイルする時に -D__GNUC__ -D__BORLANDC__ をオプションにつける
GCCでコンパイルする時に -D_MSC_VER -D__BORLANDC__ をオプションにつける
という技を駆使しろ、という>>852のお告げ。

855 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:30:44 ]
>>852
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif
これだけでいい。併用は単にコンパイル時間の高速化の意味しか無いから、違いの出る
VC++だけ書けば十分。

>>853
この書き方でちゃんと使われる。
ちなみに>>847は半分間違い。>>852で両方とも有効に働く。

856 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:31:13 ]
凄いな神の技だ・・

857 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:38:44 ]
>>855
> この書き方でちゃんと使われる。
アホ? &&の意味も分からないのか?

858 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 00:43:12 ]
>>855
使われねぇよw

859 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 05:24:50 ]
>>855
#pragma once は、VC++4.2(_MSC_VER=1020)からサポートされたと考えていい?

860 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 05:47:27 ]
1000にしてるライブラリもある
1020にしてるライブラリもある

861 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 21:36:23 ]
STL でつまづいています。

codepad.org/KNe3UsXV

lst1.merge(lst2) でマージだけでなくソートされてしまうのはどうしてでしょうか?

862 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 21:41:10 ]
なぜならmergeというのはマージソートでいうところのマージを行う関数だからです



863 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 22:12:32 ]
こじつけ気味に言うとjoinでなくmergeだから。プログラム関連ではだいたい以下のニュアンス。
join:二つのものをつなげて一つにする。繋ぎ目で切り離せば元の二つに戻る。
merge:二つのものを混ぜて一つにする。元の二つに戻すには構成要素を一つずつより分ける必要がある。

864 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 23:01:23 ]
>>861
しっかりドキュメント読め。
lst1.merge(lst2)はソートする。O(n)
lst1.splice(lst2)はソートしない。O(1)

>>863も書いているけど、mergeはどちらかと言うと順序関係を保存して結合する
という意味合いが強いね。順序関係を作るためにソートが必要になるということ
だと思う。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<217KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef