C言語@便利なマクロat TECH
C言語@便利なマクロ - 暇つぶし2ch116:デフォルトの名無しさん
06/06/17 01:46:25
>>115
>>103-107

117:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/06/24 00:20:25
関数でやる仕事って気もするけどなあ。

119:デフォルトの名無しさん
06/06/24 10:08:15
展開後が即値になるからマクロにする意義がある。

俺も初心者の頃、2進数の表記がないのを不思議に思った。
処理系の拡張機能で 0b1010 とか書けるのもあるが、一般性がない。
マクロを作ろうと考えたが、当時の俺では無理だった。
何年も後になって、>>115 で紹介されてるマクロを知ったときには感激したよ。

120:デフォルトの名無しさん
06/06/24 11:11:54
つーか脳内で2進⇔16進変換しろよ

121:デフォルトの名無しさん
06/06/25 00:16:11
組み込み分野とかではビットのON/OFFに意味があるケースが頻出する。
そんなときは2進数で書くと可読性が向上するんだよ。

122:デフォルトの名無しさん
06/06/25 00:49:04
とてもそうは思えんが・・・
具体例を書いて欲しいところ。

123:デフォルトの名無しさん
06/06/25 17:49:57
俺はレジスタにビットフィールドでアクセスしたりするが。
レジスタアクセスは機種依存なので、移植性は気にしない。
どのようにコードに落ちるかわからなければ、割り込み関連のレジスタ等の
ちょっと特殊なものではバグを出す可能性が高くなるのでおすすめはしない。

ただ、コンパイラによっては、char等のビットフィールドでもintでアクセスする。
そういう生真面目な実装をしているコンパイラは、コンパイル時に
ビットフィールドはint以外はダメよと教えてほしい。

124:デフォルトの名無しさん
06/06/25 17:56:41
>char等のビットフィールド
すまん、詳しく教えてくれ。Cのビットフィールドに種類があるとは初耳なもんで。

125:デフォルトの名無しさん
06/06/25 19:44:56
>>124
生真面目だな。規格オタか?

126:デフォルトの名無しさん
06/06/26 00:01:48
皮肉っているだけだろ。

127:デフォルトの名無しさん
06/06/26 06:48:28
ビットフィールドを定義したヘッダーファイルが用意されてない場合、
マイコンのレジスタを初期化するためだけに自分でビットフィールドを定義するのも面倒。
どうせ暗号みたいな名前しか付けられないから、それほど読みやすくもならない。
そんなときは直接16進数で代入しちゃうわけだが、2進数で書けるならその方がいい。

>>124
ビットフィールドは処理系依存だ。最上位ビットから詰めるか最下位ビットから詰めるか
それすら決まってない。int境界をまたぐ場合なんかも注意が必要。

128:デフォルトの名無しさん
06/06/26 18:03:38
>127
> そんなときは直接16進数で代入しちゃうわけだが

飛びすぎ。
まずレジスタの各flagごとにアクセスマクロを定義しないか

129:デフォルトの名無しさん
06/06/27 01:27:35
そう来ると思ったw
余裕があればそうする。
仕様変更で数値が変わりそうな部分は面倒でもマクロとか使うよ。

130:デフォルトの名無しさん
06/06/27 09:22:57
Windowsでリソース使わずに bitmap を作るのに使ったな

131:デフォルトの名無しさん
06/06/28 03:12:50
2値のグラフィックデータを自作する場合に便利だね。
モノクロ液晶表示器に描画するアイコンとかフォントを定義するのに使ったことある。

132:デフォルトの名無しさん
06/07/01 02:18:15
分かち書き無しの 64bits 2進数なんてみたくねー

133:デフォルトの名無しさん
06/07/01 02:25:42
int mask = 0b0110000101000110010011000110001000011001000101101000010110001001;

134:デフォルトの名無しさん
06/07/01 02:26:14
int じゃなかった・・・。

135:デフォルトの名無しさん
06/07/23 00:10:29
INLINE( FunctionName ) と書いて
#pragma inline FunctionName
に置き換わるマクロを書きたいのですがどのように定義したらいいでしょうか?

136:デフォルトの名無しさん
06/07/23 00:32:18
>>134
環境によってはintが64bitかも

137:デフォルトの名無しさん
06/07/23 00:53:22
>>135
C言語の範疇じゃ無理。
どうしても対応したいなら
自分でプリプリプロセッサでも作って
コンパイル前にソースに手を加えるしかない。

138:デフォルトの名無しさん
06/07/23 00:57:18
C99だと_Pragmaが使えると思う。

139:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/10/10 00:13:59
>>139
こんなんでできね?
#define FUNC_2(x, y) func_##x##_##y
#define FUNC_A_B FUNC_2(A, B)

141:デフォルトの名無しさん
06/10/10 00:54:49
>>140
GCC で確認したら func_1_2 ではなく func_A_B になってしまいました。

142:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/11/03 19:18:43
この手の中継マクロはなんで必要なんだろ

145:デフォルトの名無しさん
06/11/03 20:46:45
>>144
昔のプリプロセッサの仕様との後方互換性。
負の遺産とも言う

146:デフォルトの名無しさん
06/11/03 21:12:10
相続拒否してえ…

147:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/11/14 07:31:26
##の引数として使われるマクロ引数は展開(評価)されないってこと?

149:デフォルトの名無しさん
06/11/20 06:06:26
引数にマクロ名を渡した場合、
実際にそのマクロが展開されるのは一段階遅れる。
func_1_2 じゃなくて func_A_B ってのを実際に作りたい時とか、
すぐ展開されると困るっしょ?

150:デフォルトの名無しさん
06/11/28 00:21:40
>>39
foreverって有名だろ
世代差?

151:デフォルトの名無しさん
06/11/28 04:02:44
俺はforever使うよ。

152:デフォルトの名無しさん
06/11/28 06:45:54
forever と定義した事もあるが、
別に for(;;) で困る事ないので定義しなくなった。

153:デフォルトの名無しさん
07/03/05 23:41:46
あげます

154:デフォルトの名無しさん
07/03/05 23:54:10
#define forever for(;;)
#define unless(cond) if(!(cond))
#define until(cond) while(!(cond))

155:デフォルトの名無しさん
07/03/06 01:26:55
>>150-152
forever/for(;;)は知ってるけど、キモイから
俺はwhile(true)/while(1)を使う。

156:デフォルトの名無しさん
07/03/06 01:45:23
ANSIから見放されるやつ乙

157:デフォルトの名無しさん
07/03/06 06:30:28
同僚から見放されるコード書くよりマシw

158:デフォルトの名無しさん
07/03/06 07:46:44
for (;;)を書いて見放されるような同僚なら、こっちから願い下げだ。

159:デフォルトの名無しさん
07/03/06 09:29:34
while(1) はマジックナンバーがあってキモい。
while(true) はかろうじて許せる。

160:デフォルトの名無しさん
07/03/06 10:09:31
while(1)はマジックナンバーなのか??

161:デフォルトの名無しさん
07/03/06 10:18:22
>>158
馬鹿でも読めるコードを日頃から心がけておかないと、
いつまでたっても自分でメンテしなきゃいけなくて
コードの手離れが悪くなるぞ。

162:デフォルトの名無しさん
07/03/06 10:23:42
古めのコンパイラだと警告になることあるね  while(1)

163:デフォルトの名無しさん
07/03/06 17:34:35
lint の類も while(1) には警告出るよ。
for(;;) で書けって言っても気持ち悪いと感じるやつも多いらしい。
だから forever を定義して統一させている。

>>154
俺も同じことしてるよw

164:デフォルトの名無しさん
07/03/06 19:39:29
while(1) は while(2) でも while(829344) でもいいのが気持ち悪い。

165:デフォルトの名無しさん
07/03/06 19:41:34
while(42)

166:デフォルトの名無しさん
07/03/06 20:17:51
>>164
個人的には、文と左括弧の間に空白がない方がよっぽど気持ち悪いけどな。

while ("∀")

167:デフォルトの名無しさん
07/03/06 20:24:13
むしろ、

while ( 'A') {


168:デフォルトの名無しさん
07/03/06 20:26:14
while ('A' ) while ('q' ) while ( 'o') while ( '3')

こんどから、これで遊ぼうかな

169:デフォルトの名無しさん
07/03/06 20:29:17
for (;;)

170:デフォルトの名無しさん
07/03/06 21:58:14
Boostの普通に使えるんじゃないの
というかCの方がC++より進化してるよな

171:デフォルトの名無しさん
07/03/06 22:12:38
Boost.PreProcesserは確かにCでも使えるだろうな

172:デフォルトの名無しさん
07/03/06 23:12:47
>>166
while(...) { ... } の全体で一つの文なんだが

173:デフォルトの名無しさん
07/03/07 00:02:47
URLリンク(sourceforge.net)
これか
Boostには世話になってるが正直理解不能
マクロでgenericsかよ

174:デフォルトの名無しさん
07/03/07 01:00:39
>>173
これダウンロードできなくない?CVSにもアクセスできないし

175:デフォルトの名無しさん
07/03/07 15:57:17
>>172
そうか。では while/switch/if 各キーワードとその後の左括弧、と訂正しよう。
ところで、
>while(...) { ... } の全体で一つの文なんだが
それは間違い。

176:デフォルトの名無しさん
07/03/07 16:08:25
そんなことはない

177:デフォルトの名無しさん
07/03/07 20:29:04
>>175
ジョークだよね?

178:デフォルトの名無しさん
07/03/15 00:22:43
誰か「式」と「文」の意味を教えてやれ

179:デフォルトの名無しさん
07/03/15 12:33:31
技術者なら規格書くらい嫁、としか言えません。
ドカタなら…お悔やみ申し上げます。

180:デフォルトの名無しさん
07/03/29 02:09:51
#define MY_STATUS (*v*)

181:デフォルトの名無しさん
07/07/14 22:24:48
//整数の絶対値を求める
#define abs(a) ((a xor (a>>31))-(a>>31))

182:デフォルトの名無しさん
07/07/14 23:14:56
64bitでしねる

183:デフォルトの名無しさん
07/07/15 02:59:00
マクロ使わんでもちゃんと最適化されるがな。

184:デフォルトの名無しさん
07/07/15 20:49:04
//割り算の余剰を求める
#define mod(a,b) (-(b*(a/b))+a)

185:デフォルトの名無しさん
07/07/15 21:01:19
#define mod(a,b) (-((b)*((a)/(b)))+(a))

186:デフォルトの名無しさん
07/07/17 10:37:15
>>184>>185
mod演算子の存在意義を否定するろくでもないマクロだな。
実数なら関数があるんだし。
>>181
>183じゃないが、下手すりゃ普通に書いたほうが速いぞ。

187:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/09/27 14:36:41
#define HELLOWORLD (puts("Hello World"));

189:デフォルトの名無しさん
07/09/27 16:53:35
#define fib(n) (n>2)?fib(n-1)+fib(n-2):1

190:sage
07/09/27 23:37:02
#define l i
#define retrun return
#define mail main

これでもうtypoも怖くない。
ってか、数日前に部下が素でやってたのを見たとき、
バカはバカなりに頭を使うものだと感動した。

191:デフォルトの名無しさん
07/09/28 00:24:23
mianならよくあるな。

C++@便利なテンプレート
ならもっと色々出てきたろうに。普通にクイックソートとか書けるからなぁ。

192:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/09/28 13:58:09
#define return main();

194:デフォルトの名無しさん
07/09/28 14:02:21
>>192
その実装で異なる名前のついたマクロ10種類くらい見たな。
せめて一番上だけでも標準化しろ。

195:デフォルトの名無しさん
07/09/28 14:18:54
->
を使ったプログラムを作れ

196:デフォルトの名無しさん
07/09/28 19:47:26
/*->*/

197:デフォルトの名無しさん
07/09/29 22:15:38
>>194
有名なところで、XtNumber, nuberof,辺りか?

198:デフォルトの名無しさん
07/09/30 00:19:27
>>194
おれはNARRAYという名前にした


199:デフォルトの名無しさん
07/09/30 02:00:54
>>192 >>194
最もよく使うであろう一番目が標準化されない理由は知らんが、
二番目のは offsetof として標準化されている。

200:デフォルトの名無しさん
07/09/30 04:29:49
#define Rem /##/

201:デフォルトの名無しさん
07/09/30 07:45:18
>>199
俺も最初offsetofかと思ったけど、よく見ると違うぞ。
名前どおり、メンバに対するNELEMSになっている。

202:デフォルトの名無しさん
07/09/30 14:09:39
長さの不明な配列っぽいものに適用して嵌る連中がでるからな。

203:デフォルトの名無しさん
07/10/27 04:54:44
2番目の意味が分からんのですが、誰か教えてくだされ

204:デフォルトの名無しさん
07/10/29 12:02:38
>>203
offsetofでぐぐれ。

205:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/17 22:14:29
>>167-168
これいいなあ

207:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/11/19 07:01:18
C++じゃねぇかww

209:デフォルトの名無しさん
07/11/19 20:04:33
ほんとだ。それだったらboost::shared_ptrから
参照カウントを取り除いたようなものを作れば十分だよ。マクロ要らない。

210:デフォルトの名無しさん
07/11/21 01:02:00
NELEMSはプログラミング作法に同じ名前で載ってたな。
ぐぐったらこのスレがヒットしたw

211:デフォルトの名無しさん
07/12/26 22:14:01
finallyが欲しいな。

212:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/28 12:56:52
…あれ?
C言語って例外あったの?

214:デフォルトの名無しさん
07/12/28 12:58:59
いいえ、それはCではありません。


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