C++相談室 part71at TECH
C++相談室 part71 - 暇つぶし2ch844:デフォルトの名無しさん
09/08/25 22:10:39
インクルードガードと#pragma onceが両方とも有効な状態って問題ある?

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


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

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

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

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

850:デフォルトの名無しさん
09/08/25 22:50:48
>>849 assert.h を #define NDEBUG して #include したり #under NDEBUG して #include したり。

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

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

本文

#endif

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

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

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

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

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

856:デフォルトの名無しさん
09/08/25 23:31:13
凄いな神の技だ・・

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

858:デフォルトの名無しさん
09/08/26 00:43:12
>>855
使われねぇよw

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

860:デフォルトの名無しさん
09/08/26 05:47:27
1000にしてるライブラリもある
1020にしてるライブラリもある

861:デフォルトの名無しさん
09/08/26 21:36:23
STL でつまづいています。

URLリンク(codepad.org)

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

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

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

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

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


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch