- 1 名前:1 [2006/04/12(水) 15:51:10 ]
- C言語、C++の便利なマクロを紹介すれ。
とりあえず、頭は簡単な #define PI 3.141592f #define DEG_2_RAD(n) (n * PI / 180.0f) から。
- 124 名前:デフォルトの名無しさん mailto:sage [2006/06/25(日) 17:56:41 ]
- >char等のビットフィールド
すまん、詳しく教えてくれ。Cのビットフィールドに種類があるとは初耳なもんで。
- 125 名前:デフォルトの名無しさん mailto:sage [2006/06/25(日) 19:44:56 ]
- >>124
生真面目だな。規格オタか?
- 126 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 00:01:48 ]
- 皮肉っているだけだろ。
- 127 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 06:48:28 ]
- ビットフィールドを定義したヘッダーファイルが用意されてない場合、
マイコンのレジスタを初期化するためだけに自分でビットフィールドを定義するのも面倒。 どうせ暗号みたいな名前しか付けられないから、それほど読みやすくもならない。 そんなときは直接16進数で代入しちゃうわけだが、2進数で書けるならその方がいい。 >>124 ビットフィールドは処理系依存だ。最上位ビットから詰めるか最下位ビットから詰めるか それすら決まってない。int境界をまたぐ場合なんかも注意が必要。
- 128 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 18:03:38 ]
- >127
> そんなときは直接16進数で代入しちゃうわけだが 飛びすぎ。 まずレジスタの各flagごとにアクセスマクロを定義しないか
- 129 名前:デフォルトの名無しさん mailto:sage [2006/06/27(火) 01:27:35 ]
- そう来ると思ったw
余裕があればそうする。 仕様変更で数値が変わりそうな部分は面倒でもマクロとか使うよ。
- 130 名前:デフォルトの名無しさん mailto:sage [2006/06/27(火) 09:22:57 ]
- Windowsでリソース使わずに bitmap を作るのに使ったな
- 131 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 03:12:50 ]
- 2値のグラフィックデータを自作する場合に便利だね。
モノクロ液晶表示器に描画するアイコンとかフォントを定義するのに使ったことある。
- 132 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 02:18:15 ]
- 分かち書き無しの 64bits 2進数なんてみたくねー
- 133 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 02:25:42 ]
- int mask = 0b0110000101000110010011000110001000011001000101101000010110001001;
- 134 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 02:26:14 ]
- int じゃなかった・・・。
- 135 名前:デフォルトの名無しさん [2006/07/23(日) 00:10:29 ]
- INLINE( FunctionName ) と書いて
#pragma inline FunctionName に置き換わるマクロを書きたいのですがどのように定義したらいいでしょうか?
- 136 名前:デフォルトの名無しさん mailto:sage [2006/07/23(日) 00:32:18 ]
- >>134
環境によってはintが64bitかも
- 137 名前:デフォルトの名無しさん mailto:sage [2006/07/23(日) 00:53:22 ]
- >>135
C言語の範疇じゃ無理。 どうしても対応したいなら 自分でプリプリプロセッサでも作って コンパイル前にソースに手を加えるしかない。
- 138 名前:デフォルトの名無しさん mailto:sage [2006/07/23(日) 00:57:18 ]
- C99だと_Pragmaが使えると思う。
- 139 名前:デフォルトの名無しさん [2006/10/10(火) 00:01:15 ]
- #define A 1
#define B 2 と定義されているときに func_1_2 という識別子を生成するマクロはどのように定義すればよいでしょうか? VC では #define X(n) n #define Y() _ #define FUNC() func #define FUNC_A_B FUNC()Y()X(A)Y()X(B) のように定義できるのですが GCC ではできませんでした。
- 140 名前:デフォルトの名無しさん mailto:sage [2006/10/10(火) 00:13:59 ]
- >>139
こんなんでできね? #define FUNC_2(x, y) func_##x##_##y #define FUNC_A_B FUNC_2(A, B)
- 141 名前:デフォルトの名無しさん [2006/10/10(火) 00:54:49 ]
- >>140
GCC で確認したら func_1_2 ではなく func_A_B になってしまいました。
- 142 名前:デフォルトの名無しさん [2006/10/10(火) 01:10:40 ]
- エラーチェック無しプロパティマクロ
#define GET_FUNC(name,type,var) type Get##name(){return var;} #define SET_FUNC(name,type,var) void Set##name(type new){var=new;} #define DEF_FUNC(name,type,var) GET_FUNC(name,type,var)\ SET_FUNC(name,type,var)
- 143 名前:デフォルトの名無しさん mailto:sage [2006/10/10(火) 20:22:34 ]
- >>139
#define FUNC_2_(x, y) func_##x##_##y #define FUNC_2(x, y) FUNC_2_(x,y) #define FUNC_A_B FUNC_2(A, B)
- 144 名前:デフォルトの名無しさん mailto:sage [2006/11/03(金) 19:18:43 ]
- この手の中継マクロはなんで必要なんだろ
- 145 名前:デフォルトの名無しさん mailto:sage [2006/11/03(金) 20:46:45 ]
- >>144
昔のプリプロセッサの仕様との後方互換性。 負の遺産とも言う
- 146 名前:デフォルトの名無しさん mailto:sage [2006/11/03(金) 21:12:10 ]
- 相続拒否してえ…
- 147 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 14:03:24 ]
- #define FUNC_2(x, y) func_##x##_##y
#define FUNC_A_B FUNC_2(A, B) FUNC_A_B → FUNC_2(A, B) → func_A_B #define FUNC_2_(x, y) func_##x##_##y #define FUNC_2(x, y) FUNC_2_(x,y) #define FUNC_A_B FUNC_2(A, B) FUNC_A_B → FUNC_2(A, B) → FUNC_2_(1,2) → func_1_2 となるからだな。
- 148 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 07:31:26 ]
- ##の引数として使われるマクロ引数は展開(評価)されないってこと?
- 149 名前:デフォルトの名無しさん mailto:sage [2006/11/20(月) 06:06:26 ]
- 引数にマクロ名を渡した場合、
実際にそのマクロが展開されるのは一段階遅れる。 func_1_2 じゃなくて func_A_B ってのを実際に作りたい時とか、 すぐ展開されると困るっしょ?
- 150 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 00:21:40 ]
- >>39
foreverって有名だろ 世代差?
- 151 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 04:02:44 ]
- 俺はforever使うよ。
- 152 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 06:45:54 ]
- forever と定義した事もあるが、
別に for(;;) で困る事ないので定義しなくなった。
- 153 名前:デフォルトの名無しさん [2007/03/05(月) 23:41:46 ]
- あげます
- 154 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 23:54:10 ]
- #define forever for(;;)
#define unless(cond) if(!(cond)) #define until(cond) while(!(cond))
- 155 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 01:26:55 ]
- >>150-152
forever/for(;;)は知ってるけど、キモイから 俺はwhile(true)/while(1)を使う。
- 156 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 01:45:23 ]
- ANSIから見放されるやつ乙
- 157 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 06:30:28 ]
- 同僚から見放されるコード書くよりマシw
- 158 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 07:46:44 ]
- for (;;)を書いて見放されるような同僚なら、こっちから願い下げだ。
- 159 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 09:29:34 ]
- while(1) はマジックナンバーがあってキモい。
while(true) はかろうじて許せる。
- 160 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 10:09:31 ]
- while(1)はマジックナンバーなのか??
- 161 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 10:18:22 ]
- >>158
馬鹿でも読めるコードを日頃から心がけておかないと、 いつまでたっても自分でメンテしなきゃいけなくて コードの手離れが悪くなるぞ。
- 162 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 10:23:42 ]
- 古めのコンパイラだと警告になることあるね while(1)
- 163 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 17:34:35 ]
- lint の類も while(1) には警告出るよ。
for(;;) で書けって言っても気持ち悪いと感じるやつも多いらしい。 だから forever を定義して統一させている。 >>154 俺も同じことしてるよw
- 164 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 19:39:29 ]
- while(1) は while(2) でも while(829344) でもいいのが気持ち悪い。
- 165 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 19:41:34 ]
- while(42)
- 166 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 20:17:51 ]
- >>164
個人的には、文と左括弧の間に空白がない方がよっぽど気持ち悪いけどな。 while ("∀")
- 167 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 20:24:13 ]
- むしろ、
while ( 'A') {
- 168 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 20:26:14 ]
- while ('A' ) while ('q' ) while ( 'o') while ( '3')
こんどから、これで遊ぼうかな
- 169 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 20:29:17 ]
- for (;;)
- 170 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 21:58:14 ]
- Boostの普通に使えるんじゃないの
というかCの方がC++より進化してるよな
- 171 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 22:12:38 ]
- Boost.PreProcesserは確かにCでも使えるだろうな
- 172 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 23:12:47 ]
- >>166
while(...) { ... } の全体で一つの文なんだが
- 173 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 00:02:47 ]
- sourceforge.net/projects/chaos-pp
これか Boostには世話になってるが正直理解不能 マクロでgenericsかよ
- 174 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 01:00:39 ]
- >>173
これダウンロードできなくない?CVSにもアクセスできないし
- 175 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 15:57:17 ]
- >>172
そうか。では while/switch/if 各キーワードとその後の左括弧、と訂正しよう。 ところで、 >while(...) { ... } の全体で一つの文なんだが それは間違い。
- 176 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 16:08:25 ]
- そんなことはない
- 177 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 20:29:04 ]
- >>175
ジョークだよね?
- 178 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 00:22:43 ]
- 誰か「式」と「文」の意味を教えてやれ
- 179 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 12:33:31 ]
- 技術者なら規格書くらい嫁、としか言えません。
ドカタなら…お悔やみ申し上げます。
- 180 名前:デフォルトの名無しさん mailto:sage [2007/03/29(木) 02:09:51 ]
- #define MY_STATUS (*v*)
- 181 名前:デフォルトの名無しさん mailto:sage [2007/07/14(土) 22:24:48 ]
- //整数の絶対値を求める
#define abs(a) ((a xor (a>>31))-(a>>31))
- 182 名前:デフォルトの名無しさん mailto:sage [2007/07/14(土) 23:14:56 ]
- 64bitでしねる
- 183 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 02:59:00 ]
- マクロ使わんでもちゃんと最適化されるがな。
- 184 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 20:49:04 ]
- //割り算の余剰を求める
#define mod(a,b) (-(b*(a/b))+a)
- 185 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 21:01:19 ]
- #define mod(a,b) (-((b)*((a)/(b)))+(a))
- 186 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 10:37:15 ]
- >>184>>185
mod演算子の存在意義を否定するろくでもないマクロだな。 実数なら関数があるんだし。 >>181 >183じゃないが、下手すりゃ普通に書いたほうが速いぞ。
- 187 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 17:01:06 ]
- C89 の「負数の商・剰余は処理系依存」解消マクロかと思えば
-1/2が0になる処理系 (-1%2 = -1) で mod(-1, 2) → -1 -1/2が-1になる処理系 (-1%2 = 1) mod(-1, 2) → 1 そのまんまじゃねーかよw
- 188 名前:デフォルトの名無しさん [2007/09/27(木) 14:36:41 ]
- #define HELLOWORLD (puts("Hello World"));
- 189 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 16:53:35 ]
- #define fib(n) (n>2)?fib(n-1)+fib(n-2):1
- 190 名前:sage [2007/09/27(木) 23:37:02 ]
- #define l i
#define retrun return #define mail main これでもうtypoも怖くない。 ってか、数日前に部下が素でやってたのを見たとき、 バカはバカなりに頭を使うものだと感動した。
- 191 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 00:24:23 ]
- mianならよくあるな。
C++@便利なテンプレート ならもっと色々出てきたろうに。普通にクイックソートとか書けるからなぁ。
- 192 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 00:59:29 ]
- #define NELEMS(array) (sizeof(array)/sizeof(*(array)))
#define MEMBER_NELEMS(type, name) (NELEMS(((type*)NULL)->name)) #define END_OF_ARRAY(array) (array + NELEMS(array)) プレーンCの仕事したとき、地味に便利だった。
- 193 名前:デフォルトの名無しさん [2007/09/28(金) 13:58:09 ]
- #define return main();
- 194 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 14:02:21 ]
- >>192
その実装で異なる名前のついたマクロ10種類くらい見たな。 せめて一番上だけでも標準化しろ。
- 195 名前:デフォルトの名無しさん mailto:age [2007/09/28(金) 14:18:54 ]
- ->
を使ったプログラムを作れ
- 196 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 19:47:26 ]
- /*->*/
- 197 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 22:15:38 ]
- >>194
有名なところで、XtNumber, nuberof,辺りか?
- 198 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 00:19:27 ]
- >>194
おれはNARRAYという名前にした
- 199 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 02:00:54 ]
- >>192 >>194
最もよく使うであろう一番目が標準化されない理由は知らんが、 二番目のは offsetof として標準化されている。
- 200 名前:デフォルトの名無しさん [2007/09/30(日) 04:29:49 ]
- #define Rem /##/
- 201 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 07:45:18 ]
- >>199
俺も最初offsetofかと思ったけど、よく見ると違うぞ。 名前どおり、メンバに対するNELEMSになっている。
- 202 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:09:39 ]
- 長さの不明な配列っぽいものに適用して嵌る連中がでるからな。
- 203 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 04:54:44 ]
- 2番目の意味が分からんのですが、誰か教えてくだされ
- 204 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 12:02:38 ]
- >>203
offsetofでぐぐれ。
- 205 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 00:09:34 ]
- 最近ボツにしたマクロを晒してみる。
#define CREATE_IF(pred, type, name, params) \ std::auto_ptr<type> name; \ if (pred) { \ std::auto_ptr<type> temp##name(new type params); \ name = temp##name; \ } こんなふうに使う。 CREATE_IF(isMultiThreading, scoped_lock, lock, (this->mutex_));
- 206 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 22:14:29 ]
- >>167-168
これいいなあ
- 207 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 18:28:08 ]
- 俺が使ってる便利マクロ
D言語のscope(exit)とか便利そうだよね #define SCOPE_EXIT(var,iroiro) \ typedef BOOST_TYPEOF(var) BOOST_PP_CAT(_scopeexit_var_type,__LINE__); \ struct BOOST_PP_CAT(_scopeexit_kokodake_type,__LINE__) { \ BOOST_PP_CAT(_scopeexit_kokodake_type,__LINE__) \ (BOOST_PP_CAT(_scopeexit_var_type,__LINE__) v):var(v){} \ ~BOOST_PP_CAT(_scopeexit_kokodake_type,__LINE__)(){iroiro} \ BOOST_PP_CAT(_scopeexit_var_type,__LINE__) var; \ }BOOST_PP_CAT(_scopeexit_kokodake,__LINE__)(var); 使い方: HANDLE handle = ...; SCOPE_EXIT(handle, ::CloseHandle(handle); // スコープ抜けたら勝手に閉じられる )
- 208 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 07:01:18 ]
- C++じゃねぇかww
- 209 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 20:04:33 ]
- ほんとだ。それだったらboost::shared_ptrから
参照カウントを取り除いたようなものを作れば十分だよ。マクロ要らない。
- 210 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 01:02:00 ]
- NELEMSはプログラミング作法に同じ名前で載ってたな。
ぐぐったらこのスレがヒットしたw
- 211 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:14:01 ]
- finallyが欲しいな。
- 212 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 01:45:51 ]
- やってみた。
// ストレートに #define UNWIND_PROTECT(block, finally_block) \ { try { block } catch (...) { finally_block throw; } finally_block } // finallyブロックの複製を避けてみる class unwind_protect_no_error {}; #define UNWIND_PROTECT(block, finally_block) \ try {\ block\ throw unwind_protect_no_error();\ } catch (...) {\ finally_block;\ try {\ throw;\ } catch (const unwind_protect_no_error&) {}\ } // ノンケでも構わず喰っちまう使い方なんだぜ // デストラクタでどうにかする方が良いと思うけど…こういう遊び、好きですから… UNWIND_PROTECT({ if (!dynamic_cast<GachiHomo*>(boy)) { throw UnexpectedExperienceException(); } }, { boy->insert(this); });
- 213 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 12:56:52 ]
- …あれ?
C言語って例外あったの?
- 214 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 12:58:59 ]
- いいえ、それはCではありません。
|

|