- 1 名前:デフォルトの名無しさん [2009/07/18(土) 02:54:58 ]
- C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part70 pc12.2ch.net/test/read.cgi/tech/1244942050/l50
- 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はどちらかと言うと順序関係を保存して結合する という意味合いが強いね。順序関係を作るためにソートが必要になるということ だと思う。
|

|