- 1 名前:1 [2006/04/12(水) 15:51:10 ]
- C言語、C++の便利なマクロを紹介すれ。
とりあえず、頭は簡単な #define PI 3.141592f #define DEG_2_RAD(n) (n * PI / 180.0f) から。
- 75 名前:デフォルトの名無しさん mailto:sage [2006/06/01(木) 23:25:05 ]
- 俺ならこう定義する。
#define block switch(0) default: どっちゃにしろ使わんと思うけど。
- 76 名前:デフォルトの名無しさん mailto:sage [2006/06/01(木) 23:48:59 ]
- このスレタイは「C言語@不便なマクロ」の間違いなんじゃないだろうか
- 77 名前:デフォルトの名無しさん mailto:sage [2006/06/01(木) 23:50:37 ]
- C言語@時代遅れのマクロ
- 78 名前:デフォルトの名無しさん mailto:sage [2006/06/01(木) 23:57:50 ]
- なら便利なマクロを投下すればいい。
- 79 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 00:30:05 ]
- マクロならできて、インライン関数とテンプレートでできないことを教えてくれ。
- 80 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 00:43:55 ]
- >>79
#ifでの利用。 #define FOO 1 #if FOO ...; #else ...; #endif
- 81 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 00:49:59 ]
- >>79
>>75 こういう系統のマクロ。
- 82 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 01:19:33 ]
- >>80
const int FOO = 1; if(FOO){...;}else{...;} じゃだめなの? 実行されない側のブロックは最適化によって除去されるから容量面でも速度面でも変わらない気がするんだけど
- 83 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 01:25:05 ]
- お前は何を言ってるのかと小一時間・・・
それだと関数内の処理でしか使えんじゃないのよ。
- 84 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 01:29:01 ]
- ああそうか、#if〜#endif内で関数の宣言とかしたいってことか。じゃあ
const FOO; template <int FOO> class{...}; template <0> class{...}; でどうだろ? だめかな?
- 85 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 01:31:18 ]
- おっと名前付けるの忘れた。
template <int FOO> class foo{...}; template <0> class foo{...}; んー、FOOとfooで名前を2個登場するのがちょっと嫌だな。
- 86 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 01:35:49 ]
- 何それ?テンプレートの特殊化のつもり?
- 87 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 01:38:09 ]
- 何でこんなに使用状況を限定するのか理解できんな。
#ifdef 使った事ないのかね。
- 88 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 01:42:41 ]
- ごめん特殊化ってどうやるんだっけ。
なれない事はするもんじゃないね。 えーと const FOO; template <int FOO> class foo{...}; template<> foo<0>{...}; こうだっけ? まあとにかく、C++ならマクロは使わないでもいけるんじゃないかなーと言いたかったのです。 すまん、がんばって勉強すっから許して。
- 89 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 01:46:17 ]
- #ifdefはさすがに無理だな。
- 90 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 01:47:14 ]
- とりあえず二重インクルードガードを
マクロ無しで書けるもんなら書いてみろ。 ただし、コンパイラ固有の方法での二重インクルードガードは無しな。
- 91 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 01:48:36 ]
- #ifdef _DEBUG
とか結構使いどころ多いと思うが
- 92 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 01:56:50 ]
- 予約語置き換えとかも無理だね。
#define local static みたいなやつ
- 93 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 02:00:55 ]
- __FILE__ や __LINE__ を自動で引数に入れたい時とかもマクロ必須だな。
inline だとそっちのファイル名と行番号が使われてしまう。
- 94 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 02:24:25 ]
- >>88
クラスとか関数だけならその方法でもいける。 enum { FOO = 0 }; template <int FOO> class foo{...}; template<> foo<0>{...}; foo<FOO> food; こんな感じかな?
- 95 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 11:38:14 ]
- __RAND__とかあったら便利なんだけど、
乱数生成するマクロ。 誰か作ってよ
- 96 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 11:41:01 ]
- #define __RAND__ rand()
ほれ
- 97 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 11:44:23 ]
- >>96そういうんじゃなくて
静的に乱数を生成したいってことなんだけどwww
- 98 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 11:47:58 ]
- ネタをネタと(ry
- 99 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 11:52:15 ]
- #define __RAND_NEXT__(next) (((next * 1103515245L + 12345) / 65536L) % 32768U)
#define __RAND__ (__RAND_NEXT__(__RAND_NEXT__(__RAND_NEXT__(__LINE__)))) 同一行で使えないが
- 100 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 11:53:12 ]
- コンパイルごとに違う値が出るものといえば __DATE__ マクロと __TIME__ マクロがあるから、
「コンパイルごとに違う値が出る」というのだけを実現する事は可能。 ただし、こいつらどっちも文字列だから、 そこから得た値を使って配列のサイズに指定したりとか、そういうのは無理だけど。
- 101 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 12:00:48 ]
- >>100
文字列を数値に変換するマクロって無かったっけ?
- 102 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 12:03:37 ]
- 文字列化ならできるけれど、数値化はミリ
- 103 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 15:48:13 ]
- 擬似2進数マクロ。 たまーに欲しくなる
#define HEX_0000 0x00 #define HEX_0001 0x01 ... #define HEX_1111 0x0f /* ゼロサプレスを面倒みるなら #define HEX_0 0x00 #define HEX_1 0x01 #define HEX_10 0x02 #define HEX_11 0x03 とかも追加な */ #define BIN4(a) (HEX_ ## a) #define BIN8(a, b) ((HEX_ ## a) << 4 + ((HEX_ ## b))
- 104 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 16:22:19 ]
- もっといい方法があるよ。
- 105 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 16:23:52 ]
- ヒントは 0x##n とビット演算
- 106 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 16:30:32 ]
- GEMのコードっしょ? < 0x ## n タイプ
- 107 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 16:44:40 ]
- それと例の静的 ASSERT を組み合わせれば
引数チェックもできるってぇ寸法だ。
- 108 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 16:56:00 ]
- >>106
自分で考えた。 GEM は知らんが、あるというのならあるんだろうね。
- 109 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 17:23:30 ]
- 数値リテラルを記述するのに
0 <digits> や 0x <digits> があるのに 0b <digits> が無いは何か理由があるのだろうか・・・
- 110 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 17:34:17 ]
- 0b00100100101000000100000010011000
とか書かれても困るからじゃね? D 言語ではそこのところを、 区切りを入れられるようにして解決してる。
- 111 名前:109 mailto:sage [2006/06/02(金) 17:39:32 ]
- >>110
確かに連続して書くと見難いな。 D言語での区切り文字は 空文字(TAB/SPC/改行) ? 0b00100100101000000100000010011000 ↑等価↓ 0b 0010 0100 1010 0000 0100 0000 1001 1000
- 112 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 17:42:34 ]
- 確かアンダースコアだったと思う。
0b__0010_0100__1010_0000__0100_0000__1001_1000 こんな感じ。
- 113 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 17:54:21 ]
- herumi氏のHPにtemplateでやる方法が書いてあったな。
- 114 名前:デフォルトの名無しさん mailto:sage [2006/06/02(金) 18:02:19 ]
- boostでそんなマクロなかったっけ?
- 115 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 00:03:04 ]
- 「C言語:2進数表記マクロ」はがいしゅつ?
ttp://homepage1.nifty.com/aok2/004/c02.html
- 116 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 01:46:25 ]
- >>115
>>103-107
- 117 名前:デフォルトの名無しさん mailto:sage [2006/06/23(金) 17:08:43 ]
- 昔その逆パターンに着手した
#define bit(i) ( ( i & 1 ) \ | ( i & 1 << 1 ) << 0x2 \ | ( i & 1 << 2 ) << 0x4 \ | ( i & 1 << 3 ) << 0x6 \ | ( i & 1 << 4 ) << 0x8 \ | ( i & 1 << 5 ) << 0xa \ | ( i & 1 << 6 ) << 0xc \ | ( i & 1 << 7 ) << 0xe ) printf("%o\n", bit(255)); 11111111 使う場皆無
- 118 名前:デフォルトの名無しさん mailto:sage [2006/06/24(土) 00:20:25 ]
- 関数でやる仕事って気もするけどなあ。
- 119 名前:デフォルトの名無しさん [2006/06/24(土) 10:08:15 ]
- 展開後が即値になるからマクロにする意義がある。
俺も初心者の頃、2進数の表記がないのを不思議に思った。 処理系の拡張機能で 0b1010 とか書けるのもあるが、一般性がない。 マクロを作ろうと考えたが、当時の俺では無理だった。 何年も後になって、>>115 で紹介されてるマクロを知ったときには感激したよ。
- 120 名前:デフォルトの名無しさん mailto:sage [2006/06/24(土) 11:11:54 ]
- つーか脳内で2進⇔16進変換しろよ
- 121 名前:デフォルトの名無しさん mailto:sage [2006/06/25(日) 00:16:11 ]
- 組み込み分野とかではビットのON/OFFに意味があるケースが頻出する。
そんなときは2進数で書くと可読性が向上するんだよ。
- 122 名前:デフォルトの名無しさん mailto:sage [2006/06/25(日) 00:49:04 ]
- とてもそうは思えんが・・・
具体例を書いて欲しいところ。
- 123 名前:デフォルトの名無しさん mailto:sage [2006/06/25(日) 17:49:57 ]
- 俺はレジスタにビットフィールドでアクセスしたりするが。
レジスタアクセスは機種依存なので、移植性は気にしない。 どのようにコードに落ちるかわからなければ、割り込み関連のレジスタ等の ちょっと特殊なものではバグを出す可能性が高くなるのでおすすめはしない。 ただ、コンパイラによっては、char等のビットフィールドでもintでアクセスする。 そういう生真面目な実装をしているコンパイラは、コンパイル時に ビットフィールドはint以外はダメよと教えてほしい。
- 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(...) { ... } の全体で一つの文なんだが それは間違い。
|

|