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


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

C言語@便利なマクロ



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(...) { ... } の全体で一つの文なんだが
それは間違い。

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ではありません。






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

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

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