C言語@便利なマクロ
■ このスレッドは過去ログ倉庫に格納されています
00011
2006/04/12(水) 15:51:10とりあえず、頭は簡単な
#define PI 3.141592f
#define DEG_2_RAD(n) (n * PI / 180.0f)
から。
0002デフォルトの名無しさん
2006/04/12(水) 15:55:07× >>1 とりあえず、頭は簡単な
○ >>1 俺はゴミマクロ。
○ さあ早く優秀なマクロおくれよ〜〜(クレクレクレクレ
0003デフォルトの名無しさん
2006/04/12(水) 16:53:10#define FALSE 0
0004デフォルトの名無しさん
2006/04/12(水) 17:07:15#define TRUE ~FALSE
0005デフォルトの名無しさん
2006/04/12(水) 17:21:20#define DEG_2_RAD(n) ((n) * PI / 180.0f)
の方が良くない?
0006デフォルトの名無しさん
2006/04/12(水) 17:25:370007デフォルトの名無しさん
2006/04/12(水) 18:06:48// 配列の要素数を戻す
#define numberof(v) (sizeof (v) / sizeof *(v))
// VC++ 6.0 で、for () 内で定義した変数のスコープをC++標準に
#define for if (0); else for
>>5
× の方が良くない?
○ とするべき。
0008デフォルトの名無しさん
2006/04/12(水) 19:37:200009デフォルトの名無しさん
2006/04/12(水) 19:41:050010デフォルトの名無しさん
2006/04/12(水) 19:43:28初めて知りました。
が、これだと偽でもコンパイル通っちゃわない?
#define STATIC_ASSERT(expr) { char dummy[(expr) ? 1 : -1]; }
ではないかと思うんだけど…
0011デフォルトの名無しさん
2006/04/12(水) 22:30:340012デフォルトの名無しさん
2006/04/13(木) 01:09:070013デフォルトの名無しさん
2006/04/13(木) 08:39:06hoge.h
#ifndef HOGE_H
#define HOGE_H
/*******/
#endif
0014デフォルトの名無しさん
2006/04/13(木) 22:20:05#define __STR2__(x) #x
#define __STR1__(x) __STR2__(x)
#define __LOC__ __FILE__ "("__STR1__(__LINE__)") : "
0015デフォルトの名無しさん
2006/04/14(金) 12:04:52offsetof って標準C にあるんだけどね。C99 からだっけ?
0016デフォルトの名無しさん
2006/04/14(金) 22:44:02__LOC__ マクロすごいな
__STR1__、__STR2__ と2段にしないといけないのは、どういう仕組みになってるんだろう?
わかる人いる?
0017デフォルトの名無しさん
2006/04/15(土) 00:09:50__LINE__はマクロの皮を剥いでも、数字にならない場合がある。
0018デフォルトの名無しさん
2006/04/15(土) 01:05:560019デフォルトの名無しさん
2006/04/17(月) 09:41:500020デフォルトの名無しさん
2006/04/17(月) 10:27:540021デフォルトの名無しさん
2006/04/17(月) 21:23:160022デフォルトの名無しさん
2006/04/19(水) 19:02:13あ、C++じゃなくてCだから安心して整数扱いできるのか。
0023デフォルトの名無しさん
2006/04/19(水) 19:15:330024デフォルトの名無しさん
2006/04/19(水) 19:24:090025デフォルトの名無しさん
2006/04/19(水) 21:02:25002623
2006/04/19(水) 21:29:440027デフォルトの名無しさん
2006/04/20(木) 04:32:25#define iskanji2(c) ((c)>=0x40 && (c)<=0xFC && (c)!=0x7F)
0028デフォルトの名無しさん
2006/04/20(木) 21:26:210029デフォルトの名無しさん
2006/04/20(木) 22:11:450030デフォルトの名無しさん
2006/04/22(土) 03:17:570031デフォルトの名無しさん
2006/04/23(日) 11:15:180032デフォルトの名無しさん
2006/04/23(日) 14:54:23#define BLOCK(L) if (0) _LABEL(BREAK,L):; else _LABEL(CONTINUE,L):
#define BREAK(L) goto _LABEL(BREAK,L)
#define CONTINUE(L) goto _LABEL(CONTINUE,L)
int main()
{
BLOCK(X) {
BLOCK(Y) {
BREAK(X); /* Great! */
}
printf("end of Y\n");
}
printf("end of X\n");
CONTINUE(Y); /* Oops! */
return 0;
}
0033デフォルトの名無しさん
2006/04/23(日) 22:53:06[ ゚д゚]y-~~~ デフラグガカンリョウシマシタ
/[へへ
!!""""############(((((((((((((((())))))))))))))))
****,,,,,////00::;;;;;;AAAAAAAAABBBBBBBBBBBBCCCCCCCEEEEEEEEEEEEEGIIIIKKKKKKKLLLLLLLL
LLLLLLLLLLLLNNNNNNNNOOOOOOOORRRRTTTTUUUUXXXXXYYYYY\\___________aaddddddeeeeeeeee
eeeeefffffffffggiiiiiiiiilmnnnnnnnnnnnnnoooooooppprrrrrsstttttttu{{{}}}
0034デフォルトの名無しさん
2006/04/28(金) 10:45:140035デフォルトの名無しさん
2006/05/20(土) 20:05:270036デフォルトの名無しさん
2006/05/20(土) 20:15:08#define end }
0037デフォルトの名無しさん
2006/05/20(土) 20:19:41絶対誰かが書くと思っていた
0038デフォルトの名無しさん
2006/05/20(土) 20:20:36#define ifn if!(
#define loop for(;;){
ところで define でググると「#define」って同人サークルのサイトがトップに来るのな。
予約語をサークル名(サイト名)にするとは考えたな。
俺もなんかの予約語でWebサイト作ればウハウハかな?
0039デフォルトの名無しさん
2006/05/20(土) 20:22:060040デフォルトの名無しさん
2006/05/20(土) 20:22:33Lispサイコー
0041デフォルトの名無しさん
2006/05/20(土) 20:25:27ところでこのスレタイは「便利なマクロ@C言語」が正しいんじゃないかと思うんだが。。。
0042デフォルトの名無しさん
2006/05/20(土) 20:27:36#if 0
#else
でコメントアウト。
/* */と違ってネストできる。
0043デフォルトの名無しさん
2006/05/20(土) 20:34:330044デフォルトの名無しさん
2006/05/20(土) 20:38:250045デフォルトの名無しさん
2006/05/20(土) 21:00:10>if!(
>while!(
( ´,_ゝ`)
初心者がマクロを使うとろくな結果にならない典型ですね。
0046デフォルトの名無しさん
2006/05/20(土) 21:09:38バカにつっこむバカの典型
0047デフォルトの名無しさん
2006/05/20(土) 21:16:060048デフォルトの名無しさん
2006/05/20(土) 21:36:53の一行も怪しくないか?
loop{sum++;}にしたらとっても美味しくないぞ
0049デフォルトの名無しさん
2006/05/20(土) 21:47:520050デフォルトの名無しさん
2006/05/20(土) 22:35:10とっても便利だ
0051デフォルトの名無しさん
2006/05/20(土) 22:35:410052デフォルトの名無しさん
2006/05/20(土) 22:44:270053デフォルトの名無しさん
2006/05/20(土) 22:46:510054デフォルトの名無しさん
2006/05/20(土) 23:02:060055デフォルトの名無しさん
2006/05/20(土) 23:30:270056デフォルトの名無しさん
2006/05/21(日) 00:07:17static void SASSERT_(void *) { }
#define SASSERT(b) SASSERT_(!(b))
b が静的な真値定数なら
引数が 0 になってヌルポインタとして扱えるため
コンパイルが通る。
何も処理しないため、最適化で削除される。
b が静的な偽値定数なら
引数が 1 になってポインタとして扱えないため
コンパイルに失敗する。
0057デフォルトの名無しさん
2006/05/21(日) 01:47:27>>6
0058デフォルトの名無しさん
2006/05/21(日) 02:02:29>>56 はコンマ演算子で繋げば式中で使える。
値に置換されるようなマクロの
引数チェックに使ったりできる。
>>6 は文としてしか使えないから、
>>56 より適用範囲が狭い。
0059デフォルトの名無しさん
2006/05/21(日) 06:40:51確かに式として使えるけど
コンパイルエラーを検出したいだけなのに
そんなにメリットがあるの?
if(SASSERT(CHAR_BIT==8)) {
}
のようにifで囲っても見辛くなるだけだし、
コンマ演算子で繋げるっていっても
SASSERT(sizeof(int)==4),SASSERT(sizeof(void*)==4),・・・;
とかしても可読性が下がるだけような…(いずれも自分的には)
何か良い使い方があるなら教えて。
0060デフォルトの名無しさん
2006/05/21(日) 06:53:40#define BIT(n) (1u << (n))
というマクロがあるとする。
これを、n を静的な定数に制限する代わりに
静的に n の値をチェックしてくれるようにしたいとする。
こういう場合にこのタイプの SASSERT が使える。
#define SBIT(n) (SASSERT(0 <= (n) && (n) < CHAR_BIT * sizeof (unsigned)), 1u << (n))
静的だから n に副作用はないから
n が複数出る事に問題は無い。
006159
2006/05/21(日) 07:56:04それは(・∀・)イイ!!
と思ったけど自分の環境だと
例えば
int x=SBIT(-1);
int y=SBIT(16);
int z=SBIT(100);
として、
Cソースとしてコンパイルすると
警告が出るだけでコンパイルが通っちゃうし、
C++ソースとしてコンパイルすると
どれもboolからvoid*へ変換できないって
エラーが出てしまう。(;´Д`)
0062デフォルトの名無しさん
2006/05/21(日) 08:17:00全環境に-Wallを付けさせるわけにもいかないし…
C++は逆にvoid*に厳しすぎて使えない。
C++ならtemplateを使って実現出来るから、そっちを使った方が
エラーメッセージの質から考えてもいいだろうけど。
0063デフォルトの名無しさん
2006/05/21(日) 09:10:03>>6なら変数を指定しても標準C/C++ならエラーになるし。
0064デフォルトの名無しさん
NGNGTRUEとかFALSEとか定義せずに、そのまんま数値を使えよって、最近は思うようになった。
0065デフォルトの名無しさん
2006/05/21(日) 09:29:41つ[stdbool.h]
0066デフォルトの名無しさん
2006/05/21(日) 10:13:21>C++
なるほど。確かに bool になっちゃうね。
#define SASSERT(b) SASSERT_((b) ? 0 : 1)
にすればOKか。
>>63
変数入れれば警告はされる。
エラーじゃないのは・・・仕方が無い。
0067デフォルトの名無しさん
2006/05/21(日) 10:33:33ポインタに int 代入して警告ですむなんて。
というわけで、折衷案を考えた。
void SASSERT_(int(*p)[1]) { }
#define SASSERT(b) SASSERT_((int(*)[(b) ? 1 : -1])0)
キャストだけでもいいんだけど、
単独で使うと、意味の無い式だっていう警告が出てウザいから、
ダミーの関数を通すようにした。
0068デフォルトの名無しさん
2006/05/21(日) 10:34:11○意味の無い文
間違えた。
0069デフォルトの名無しさん
2006/05/31(水) 09:21:500070デフォルトの名無しさん
2006/06/01(木) 20:02:45void main()
{
block
{
printf("foo\n");
break;
printf("bar\n");
}
}
実行結果:
>foo
>
0071デフォルトの名無しさん
2006/06/01(木) 20:05:04必要性をまったく感じないんだが…
0072デフォルトの名無しさん
2006/06/01(木) 20:13:09既存のgoto使ったコードからむりやりgoto排除するには使えるかも。
でもC++じゃあねえ、そもそもそんなことしないか。
0073デフォルトの名無しさん
2006/06/01(木) 20:58:44カビの生えたコンパイラ対策ならif(0){}else ifだろうし
>>72
continueしても++iで結局脱出
0075デフォルトの名無しさん
2006/06/01(木) 23:25:05#define block switch(0) default:
どっちゃにしろ使わんと思うけど。
0076デフォルトの名無しさん
2006/06/01(木) 23:48:590077デフォルトの名無しさん
2006/06/01(木) 23:50:370078デフォルトの名無しさん
2006/06/01(木) 23:57:500079デフォルトの名無しさん
2006/06/02(金) 00:30:050080デフォルトの名無しさん
2006/06/02(金) 00:43:55#ifでの利用。
#define FOO 1
#if FOO
...;
#else
...;
#endif
0081デフォルトの名無しさん
2006/06/02(金) 00:49:59>>75 こういう系統のマクロ。
0082デフォルトの名無しさん
2006/06/02(金) 01:19:33const int FOO = 1;
if(FOO){...;}else{...;}
じゃだめなの?
実行されない側のブロックは最適化によって除去されるから容量面でも速度面でも変わらない気がするんだけど
0083デフォルトの名無しさん
2006/06/02(金) 01:25:05それだと関数内の処理でしか使えんじゃないのよ。
0084デフォルトの名無しさん
2006/06/02(金) 01:29:01const FOO;
template <int FOO> class{...};
template <0> class{...};
でどうだろ? だめかな?
0085デフォルトの名無しさん
2006/06/02(金) 01:31:18template <int FOO> class foo{...};
template <0> class foo{...};
んー、FOOとfooで名前を2個登場するのがちょっと嫌だな。
0086デフォルトの名無しさん
2006/06/02(金) 01:35:490087デフォルトの名無しさん
2006/06/02(金) 01:38:09#ifdef 使った事ないのかね。
0088デフォルトの名無しさん
2006/06/02(金) 01:42:41なれない事はするもんじゃないね。
えーと
const FOO;
template <int FOO> class foo{...};
template<> foo<0>{...};
こうだっけ?
まあとにかく、C++ならマクロは使わないでもいけるんじゃないかなーと言いたかったのです。
すまん、がんばって勉強すっから許して。
0089デフォルトの名無しさん
2006/06/02(金) 01:46:170090デフォルトの名無しさん
2006/06/02(金) 01:47:14マクロ無しで書けるもんなら書いてみろ。
ただし、コンパイラ固有の方法での二重インクルードガードは無しな。
0091デフォルトの名無しさん
2006/06/02(金) 01:48:36とか結構使いどころ多いと思うが
0092デフォルトの名無しさん
2006/06/02(金) 01:56:50#define local static
みたいなやつ
0093デフォルトの名無しさん
2006/06/02(金) 02:00:55inline だとそっちのファイル名と行番号が使われてしまう。
0094デフォルトの名無しさん
2006/06/02(金) 02:24:25クラスとか関数だけならその方法でもいける。
enum { FOO = 0 };
template <int FOO> class foo{...};
template<> foo<0>{...};
foo<FOO> food;
こんな感じかな?
0095デフォルトの名無しさん
2006/06/02(金) 11:38:14乱数生成するマクロ。
誰か作ってよ
0096デフォルトの名無しさん
2006/06/02(金) 11:41:01ほれ
0097デフォルトの名無しさん
2006/06/02(金) 11:44:23静的に乱数を生成したいってことなんだけどwww
0098デフォルトの名無しさん
2006/06/02(金) 11:47:580099デフォルトの名無しさん
2006/06/02(金) 11:52:15#define __RAND__ (__RAND_NEXT__(__RAND_NEXT__(__RAND_NEXT__(__LINE__))))
同一行で使えないが
0100デフォルトの名無しさん
2006/06/02(金) 11:53:12「コンパイルごとに違う値が出る」というのだけを実現する事は可能。
ただし、こいつらどっちも文字列だから、
そこから得た値を使って配列のサイズに指定したりとか、そういうのは無理だけど。
0101デフォルトの名無しさん
2006/06/02(金) 12:00:48文字列を数値に変換するマクロって無かったっけ?
0102デフォルトの名無しさん
2006/06/02(金) 12:03:370103デフォルトの名無しさん
2006/06/02(金) 15:48:13#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))
0104デフォルトの名無しさん
2006/06/02(金) 16:22:190105デフォルトの名無しさん
2006/06/02(金) 16:23:520106デフォルトの名無しさん
2006/06/02(金) 16:30:320107デフォルトの名無しさん
2006/06/02(金) 16:44:40引数チェックもできるってぇ寸法だ。
0108デフォルトの名無しさん
2006/06/02(金) 16:56:00自分で考えた。
GEM は知らんが、あるというのならあるんだろうね。
0109デフォルトの名無しさん
2006/06/02(金) 17:23:300 <digits> や 0x <digits> があるのに
0b <digits> が無いは何か理由があるのだろうか・・・
0110デフォルトの名無しさん
2006/06/02(金) 17:34:17とか書かれても困るからじゃね?
D 言語ではそこのところを、
区切りを入れられるようにして解決してる。
0111109
2006/06/02(金) 17:39:32確かに連続して書くと見難いな。
D言語での区切り文字は 空文字(TAB/SPC/改行) ?
0b00100100101000000100000010011000
↑等価↓
0b 0010 0100 1010 0000
0100 0000 1001 1000
0112デフォルトの名無しさん
2006/06/02(金) 17:42:340b__0010_0100__1010_0000__0100_0000__1001_1000
こんな感じ。
0113デフォルトの名無しさん
2006/06/02(金) 17:54:210114デフォルトの名無しさん
2006/06/02(金) 18:02:190115デフォルトの名無しさん
2006/06/17(土) 00:03:04ttp://homepage1.nifty.com/aok2/004/c02.html
0116デフォルトの名無しさん
2006/06/17(土) 01:46:25>>103-107
0117デフォルトの名無しさん
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
使う場皆無
0118デフォルトの名無しさん
2006/06/24(土) 00:20:250119デフォルトの名無しさん
2006/06/24(土) 10:08:15俺も初心者の頃、2進数の表記がないのを不思議に思った。
処理系の拡張機能で 0b1010 とか書けるのもあるが、一般性がない。
マクロを作ろうと考えたが、当時の俺では無理だった。
何年も後になって、>>115 で紹介されてるマクロを知ったときには感激したよ。
0120デフォルトの名無しさん
2006/06/24(土) 11:11:540121デフォルトの名無しさん
2006/06/25(日) 00:16:11そんなときは2進数で書くと可読性が向上するんだよ。
0122デフォルトの名無しさん
2006/06/25(日) 00:49:04具体例を書いて欲しいところ。
0123デフォルトの名無しさん
2006/06/25(日) 17:49:57レジスタアクセスは機種依存なので、移植性は気にしない。
どのようにコードに落ちるかわからなければ、割り込み関連のレジスタ等の
ちょっと特殊なものではバグを出す可能性が高くなるのでおすすめはしない。
ただ、コンパイラによっては、char等のビットフィールドでもintでアクセスする。
そういう生真面目な実装をしているコンパイラは、コンパイル時に
ビットフィールドはint以外はダメよと教えてほしい。
0124デフォルトの名無しさん
2006/06/25(日) 17:56:41すまん、詳しく教えてくれ。Cのビットフィールドに種類があるとは初耳なもんで。
0125デフォルトの名無しさん
2006/06/25(日) 19:44:56生真面目だな。規格オタか?
0126デフォルトの名無しさん
2006/06/26(月) 00:01:480127デフォルトの名無しさん
2006/06/26(月) 06:48:28マイコンのレジスタを初期化するためだけに自分でビットフィールドを定義するのも面倒。
どうせ暗号みたいな名前しか付けられないから、それほど読みやすくもならない。
そんなときは直接16進数で代入しちゃうわけだが、2進数で書けるならその方がいい。
>>124
ビットフィールドは処理系依存だ。最上位ビットから詰めるか最下位ビットから詰めるか
それすら決まってない。int境界をまたぐ場合なんかも注意が必要。
0128デフォルトの名無しさん
2006/06/26(月) 18:03:38> そんなときは直接16進数で代入しちゃうわけだが
飛びすぎ。
まずレジスタの各flagごとにアクセスマクロを定義しないか
0129デフォルトの名無しさん
2006/06/27(火) 01:27:35余裕があればそうする。
仕様変更で数値が変わりそうな部分は面倒でもマクロとか使うよ。
0130デフォルトの名無しさん
2006/06/27(火) 09:22:570131デフォルトの名無しさん
2006/06/28(水) 03:12:50モノクロ液晶表示器に描画するアイコンとかフォントを定義するのに使ったことある。
0132デフォルトの名無しさん
2006/07/01(土) 02:18:150133デフォルトの名無しさん
2006/07/01(土) 02:25:420134デフォルトの名無しさん
2006/07/01(土) 02:26:140135デフォルトの名無しさん
2006/07/23(日) 00:10:29#pragma inline FunctionName
に置き換わるマクロを書きたいのですがどのように定義したらいいでしょうか?
0136デフォルトの名無しさん
2006/07/23(日) 00:32:18環境によってはintが64bitかも
0137デフォルトの名無しさん
2006/07/23(日) 00:53:22C言語の範疇じゃ無理。
どうしても対応したいなら
自分でプリプリプロセッサでも作って
コンパイル前にソースに手を加えるしかない。
0138デフォルトの名無しさん
2006/07/23(日) 00:57:180139デフォルトの名無しさん
2006/10/10(火) 00:01:15#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 ではできませんでした。
0140デフォルトの名無しさん
2006/10/10(火) 00:13:59こんなんでできね?
#define FUNC_2(x, y) func_##x##_##y
#define FUNC_A_B FUNC_2(A, B)
0141デフォルトの名無しさん
2006/10/10(火) 00:54:49GCC で確認したら func_1_2 ではなく func_A_B になってしまいました。
0142デフォルトの名無しさん
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)
0143デフォルトの名無しさん
2006/10/10(火) 20:22:34#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)
0144デフォルトの名無しさん
2006/11/03(金) 19:18:430145デフォルトの名無しさん
2006/11/03(金) 20:46:45昔のプリプロセッサの仕様との後方互換性。
負の遺産とも言う
0146デフォルトの名無しさん
2006/11/03(金) 21:12:100147デフォルトの名無しさん
2006/11/13(月) 14:03:24#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
となるからだな。
0148デフォルトの名無しさん
2006/11/14(火) 07:31:260149デフォルトの名無しさん
2006/11/20(月) 06:06:26実際にそのマクロが展開されるのは一段階遅れる。
func_1_2 じゃなくて func_A_B ってのを実際に作りたい時とか、
すぐ展開されると困るっしょ?
0150デフォルトの名無しさん
2006/11/28(火) 00:21:40foreverって有名だろ
世代差?
0151デフォルトの名無しさん
2006/11/28(火) 04:02:440152デフォルトの名無しさん
2006/11/28(火) 06:45:54別に for(;;) で困る事ないので定義しなくなった。
0153デフォルトの名無しさん
2007/03/05(月) 23:41:460154デフォルトの名無しさん
2007/03/05(月) 23:54:10#define unless(cond) if(!(cond))
#define until(cond) while(!(cond))
0155デフォルトの名無しさん
2007/03/06(火) 01:26:55forever/for(;;)は知ってるけど、キモイから
俺はwhile(true)/while(1)を使う。
0156デフォルトの名無しさん
2007/03/06(火) 01:45:230157デフォルトの名無しさん
2007/03/06(火) 06:30:280158デフォルトの名無しさん
2007/03/06(火) 07:46:440159デフォルトの名無しさん
2007/03/06(火) 09:29:34while(true) はかろうじて許せる。
0160デフォルトの名無しさん
2007/03/06(火) 10:09:310161デフォルトの名無しさん
2007/03/06(火) 10:18:22馬鹿でも読めるコードを日頃から心がけておかないと、
いつまでたっても自分でメンテしなきゃいけなくて
コードの手離れが悪くなるぞ。
0162デフォルトの名無しさん
2007/03/06(火) 10:23:420163デフォルトの名無しさん
2007/03/06(火) 17:34:35for(;;) で書けって言っても気持ち悪いと感じるやつも多いらしい。
だから forever を定義して統一させている。
>>154
俺も同じことしてるよw
0164デフォルトの名無しさん
2007/03/06(火) 19:39:290165デフォルトの名無しさん
2007/03/06(火) 19:41:340166デフォルトの名無しさん
2007/03/06(火) 20:17:51個人的には、文と左括弧の間に空白がない方がよっぽど気持ち悪いけどな。
while ("∀")
0167デフォルトの名無しさん
2007/03/06(火) 20:24:13while ( 'A') {
0168デフォルトの名無しさん
2007/03/06(火) 20:26:14こんどから、これで遊ぼうかな
0169デフォルトの名無しさん
2007/03/06(火) 20:29:170170デフォルトの名無しさん
2007/03/06(火) 21:58:14というかCの方がC++より進化してるよな
0171デフォルトの名無しさん
2007/03/06(火) 22:12:380172デフォルトの名無しさん
2007/03/06(火) 23:12:47while(...) { ... } の全体で一つの文なんだが
0173デフォルトの名無しさん
2007/03/07(水) 00:02:47これか
Boostには世話になってるが正直理解不能
マクロでgenericsかよ
0174デフォルトの名無しさん
2007/03/07(水) 01:00:39これダウンロードできなくない?CVSにもアクセスできないし
0175デフォルトの名無しさん
2007/03/07(水) 15:57:17そうか。では while/switch/if 各キーワードとその後の左括弧、と訂正しよう。
ところで、
>while(...) { ... } の全体で一つの文なんだが
それは間違い。
0176デフォルトの名無しさん
2007/03/07(水) 16:08:250177デフォルトの名無しさん
2007/03/07(水) 20:29:04ジョークだよね?
0178デフォルトの名無しさん
2007/03/15(木) 00:22:430179デフォルトの名無しさん
2007/03/15(木) 12:33:31ドカタなら…お悔やみ申し上げます。
0180デフォルトの名無しさん
2007/03/29(木) 02:09:510181デフォルトの名無しさん
2007/07/14(土) 22:24:48#define abs(a) ((a xor (a>>31))-(a>>31))
0182デフォルトの名無しさん
2007/07/14(土) 23:14:560183デフォルトの名無しさん
2007/07/15(日) 02:59:000184デフォルトの名無しさん
2007/07/15(日) 20:49:04#define mod(a,b) (-(b*(a/b))+a)
0185デフォルトの名無しさん
2007/07/15(日) 21:01:190186デフォルトの名無しさん
2007/07/17(火) 10:37:15mod演算子の存在意義を否定するろくでもないマクロだな。
実数なら関数があるんだし。
>>181
>183じゃないが、下手すりゃ普通に書いたほうが速いぞ。
0187デフォルトの名無しさん
2007/07/17(火) 17:01:06-1/2が0になる処理系 (-1%2 = -1) で mod(-1, 2) → -1
-1/2が-1になる処理系 (-1%2 = 1) mod(-1, 2) → 1
そのまんまじゃねーかよw
0188デフォルトの名無しさん
2007/09/27(木) 14:36:410189デフォルトの名無しさん
2007/09/27(木) 16:53:350190sage
2007/09/27(木) 23:37:02#define retrun return
#define mail main
これでもうtypoも怖くない。
ってか、数日前に部下が素でやってたのを見たとき、
バカはバカなりに頭を使うものだと感動した。
0191デフォルトの名無しさん
2007/09/28(金) 00:24:23C++@便利なテンプレート
ならもっと色々出てきたろうに。普通にクイックソートとか書けるからなぁ。
0192デフォルトの名無しさん
2007/09/28(金) 00:59:29#define MEMBER_NELEMS(type, name) (NELEMS(((type*)NULL)->name))
#define END_OF_ARRAY(array) (array + NELEMS(array))
プレーンCの仕事したとき、地味に便利だった。
0193デフォルトの名無しさん
2007/09/28(金) 13:58:090194デフォルトの名無しさん
2007/09/28(金) 14:02:21その実装で異なる名前のついたマクロ10種類くらい見たな。
せめて一番上だけでも標準化しろ。
0195デフォルトの名無しさん
2007/09/28(金) 14:18:54を使ったプログラムを作れ
0196デフォルトの名無しさん
2007/09/28(金) 19:47:260197デフォルトの名無しさん
2007/09/29(土) 22:15:38有名なところで、XtNumber, nuberof,辺りか?
0198デフォルトの名無しさん
2007/09/30(日) 00:19:27おれはNARRAYという名前にした
0199デフォルトの名無しさん
2007/09/30(日) 02:00:54最もよく使うであろう一番目が標準化されない理由は知らんが、
二番目のは offsetof として標準化されている。
0200デフォルトの名無しさん
2007/09/30(日) 04:29:490201デフォルトの名無しさん
2007/09/30(日) 07:45:18俺も最初offsetofかと思ったけど、よく見ると違うぞ。
名前どおり、メンバに対するNELEMSになっている。
0202デフォルトの名無しさん
2007/09/30(日) 14:09:390203デフォルトの名無しさん
2007/10/27(土) 04:54:440204デフォルトの名無しさん
2007/10/29(月) 12:02:38offsetofでぐぐれ。
0205デフォルトの名無しさん
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_));
0206デフォルトの名無しさん
2007/11/17(土) 22:14:29これいいなあ
0207デフォルトの名無しさん
2007/11/18(日) 18:28:08D言語の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); // スコープ抜けたら勝手に閉じられる
)
0208デフォルトの名無しさん
2007/11/19(月) 07:01:180209デフォルトの名無しさん
2007/11/19(月) 20:04:33参照カウントを取り除いたようなものを作れば十分だよ。マクロ要らない。
0210デフォルトの名無しさん
2007/11/21(水) 01:02:00ぐぐったらこのスレがヒットしたw
0211デフォルトの名無しさん
2007/12/26(水) 22:14:010212デフォルトの名無しさん
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);
});
0213デフォルトの名無しさん
2007/12/28(金) 12:56:52C言語って例外あったの?
0214デフォルトの名無しさん
2007/12/28(金) 12:58:590215デフォルトの名無しさん
2008/03/19(水) 13:36:40あれはC言語の限界を超えてるぜ
0216デフォルトの名無しさん
2008/03/19(水) 13:55:020217デフォルトの名無しさん
2008/03/19(水) 13:57:17個人的にはBoost.PPとかorder-ppの方が燃える
0218デフォルトの名無しさん
2008/03/19(水) 14:49:11だからプロプロセッサなのさ
>>217
だから、offsetofが奇抜でかっこいいんじゃないか
0219デフォルトの名無しさん
2008/03/19(水) 15:34:40コンパイラ通さないのかよwww
0220デフォルトの名無しさん
2008/03/19(水) 20:53:07プロ仕様のgcc様だからこそ前処理出来ると言いたかったのでは?
#ifdef DEBUG
#define dbg(format, arg...) \
printk(KERN_DEBUG "%s: " format "\n" , __FILE__ , ## arg)
#else
#define dbg(format, arg...) do {} while (0)
#endif
#define hlist_for_each_safe(pos, n, head) \
for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \
pos = n)
0221デフォルトの名無しさん
2008/03/19(水) 21:07:350222デフォルトの名無しさん
2008/03/19(水) 21:11:580223デフォルトの名無しさん
2008/03/19(水) 21:16:02ああ、悲しい現実。
0224デフォルトの名無しさん
2008/03/19(水) 22:28:07#ifdef WIN32
#error this compiler is not supported.
#endif
0225デフォルトの名無しさん
2008/03/20(木) 14:28:07#pragma comment ( "いいえケフィアです" );
#endif
0226デフォルトの名無しさん
2008/03/22(土) 02:55:140227デフォルトの名無しさん
2008/03/22(土) 03:17:45なかなか面白いな、それ。
0228デフォルトの名無しさん
2008/03/23(日) 21:52:55#error this is no standard C/C++ compiler
#endif
0229デフォルトの名無しさん
2008/05/19(月) 12:31:22それは対応環境を狭めすぎ、せいぜい
#if defined(_MSC_VER) && (_MSC_VER < 1310)
#error this is no standard C/C++ compiler
#endif
0230デフォルトの名無しさん
2008/05/19(月) 16:54:13バージョンだけでも決められないんじゃないの?
で、結局はこうなる。
#if !defined(__STDC__)
#error this is no standard C/C++ compiler
#endif
0231デフォルトの名無しさん
2008/05/19(月) 21:01:51そこはthis is no standard C compilerだろ。
C++標準は__STDC__の定義するかどうかを処理系定義としている。
0232デフォルトの名無しさん
2008/05/21(水) 03:00:360233デフォルトの名無しさん
2008/07/20(日) 01:47:170234デフォルトの名無しさん
2008/08/21(木) 09:30:33例:ソース名:myfopen.c
#include <stdio.h>
#include <stdlib.h>
#define myfopen(DF,DM) _myfopen(DF,DM,__FILE__,__LINE__)//このマクロでファイル名と行番号を与える
FILE *_myfopen(char *f,char *m,char *s,int l)
{
FILE *fp=fopen(f,m);
if(NULL == fp){
printf("「%s」の%d行目でコールした関数で、「%s」がオープンできなかったから終了するよ。\n",s,l,f);
exit(EXIT_FAILURE);
}
return fp;
}
int main()
{
FILE *a=myfopen("nyan.txt","r");
return 0;
}
実行結果:
$ ./a.exe
「myfopen.c」の18行目でコールした関数で、「nyan.txt」がオープンできなかったから
終了するよ。
‥みたいな感じで。
0235デフォルトの名無しさん
2008/08/22(金) 18:21:250236デフォルトの名無しさん
2008/08/22(金) 18:50:56型がビット演算可能でないと・・・
同じ値だと・・・
0237デフォルトの名無しさん
2008/08/22(金) 19:01:51アドレスが同じだと不味い
0239デフォルトの名無しさん
2008/08/22(金) 19:29:19とりあえず、このマクロがダメということでおk?
0240デフォルトの名無しさん
2008/08/22(金) 19:33:38なら、これで
#define SWAP(x, y) while (x != y) { x^=y; y^=x; x^=y; }
用途限定でよろ
0241デフォルトの名無しさん
2008/08/22(金) 19:35:03○if
orz
0242デフォルトの名無しさん
2008/08/22(金) 19:38:49それはぶら下がりでだめだろう
#define SWAP(x, y) do{ if ( x != y ) { x ^= y; y ^= x; x ^= y; } }while(0)
0243デフォルトの名無しさん
2008/08/22(金) 19:44:34cool
0244デフォルトの名無しさん
2008/08/22(金) 19:49:260245デフォルトの名無しさん
2008/08/22(金) 20:17:28237の言ってることって意味不明か?
aとbが整数型なら、a!=bならaとbの値が交換されて、
a==bなら変化無し、&a==&bだと0になるってことだろ?
これって環境依存だっけ?
0246デフォルトの名無しさん
2008/08/22(金) 20:44:31やってみりゃ分かる
0247デフォルトの名無しさん
2008/08/25(月) 14:51:15DEBUG_MODEを0にすると無効化。コンパイラオプションとかで切り替えると便利そうだけど、書いただけで使った事が無い。
#define DEBUG_MODE 1
#define debug_msg_str(str) \
(DEBUG_MODE && printf("debug %+16s %+16d %+16s ; %s\n",__FILE__,__LINE__,__func__,str))
#define debug_msg_num(num) \
(DEBUG_MODE && printf("debug %+16s %+16d %+16s ; %d\n",__FILE__,__LINE__,__func__,num))
0249デフォルトの名無しさん
2008/09/02(火) 00:40:030250デフォルトの名無しさん
2008/09/03(水) 20:05:16http://www.dd.iij4u.or.jp/~okuyamak/Information/xor_fixed_swapping.html
0251デフォルトの名無しさん
2008/09/09(火) 05:30:46#define swap(x, y) (x ^= y, y ^= x, x ^= y)
注意すべきは swap(a, a) になってしまう場合。
直接こう書く人はいないが、マクロ展開後にこうなってしまうかも。
その場合はコンパイル時に警告も出てくれない。
0252デフォルトの名無しさん
2008/09/09(火) 05:34:54>250
0253デフォルトの名無しさん
2008/09/10(水) 03:50:340254デフォルトの名無しさん
2008/09/28(日) 14:53:19#define CHECK(chk) do{ \
if(!(chk)){ \
fprintf(stderr,"CHECK:%s , file %s, line %d.\n", \
(#chk), __FILE__, __LINE__); \
return;\
}\
}while(0)
0255デフォルトの名無しさん
2008/09/28(日) 15:00:56assertっぽくてそうでもないし、return ;って、voidを返す(何も返さない)関数以外では使えないじゃないか
0256デフォルトの名無しさん
2008/09/28(日) 15:13:13パラメータで渡された戻り値を返すマクロもあるよ
0257デフォルトの名無しさん
2008/10/25(土) 01:42:22#define CV_32F 1
#define CV_64F 2
みたいなのがあって、
if( type == CV_8U )
unsigned char data = array[0];
else if ( type == CV_32F )
float data = array[0];
else if (type == CV_64F )
double data = array[0];
のようなコードがあるのですが、これの if 文をなくして、
ELEMTYPE(type) data = array[0];
のように書きたい。
こんなマクロ関数って作れますか?
0258デフォルトの名無しさん
2008/10/25(土) 14:08:380259デフォルトの名無しさん
2008/10/26(日) 01:17:55inlineでいい。
0260デフォルトの名無しさん
2008/10/27(月) 04:34:580261デフォルトの名無しさん
2008/10/27(月) 07:59:41質疑応答を、ここで延々とやられると面倒。
他のスレでゴニョゴニョした結果、できたマクロが便利そうだったら、ここに貼ってくれ。
ちなみに、>257 だが、マクロ化したら逆に面倒になると思われる。
こういう処理はC++のテンプレートを使うべきだろう。
(これがCのコードなら、>257は言語仕様を理解してない初心者って事になる。)
0262デフォルトの名無しさん
2008/10/27(月) 11:04:20>(これがCのコードなら、>257は言語仕様を理解してない初心者って事になる。)
型が静的に決まらないといけないのはCもC++も同じだから、それは関係ないんじゃね
>>257
そのtypeはプリプロセッサからみて定数?
そうじゃないなら無理
例えば
ELEMTYPE(CV_8U) ...
みたいに使えるマクロなら書けるけど、
void f(int type) { ELEMTYPE(type) ... }
みたいなのは不可能
0263デフォルトの名無しさん
2008/10/28(火) 01:33:33|型が静的に決まらないと
それ以前の、変数のスコープの話。 マクロ内で変数定義した場合、if文抜けたら消えるよね。
# 変数名をマクロの引数に入れてないから汎用性もない。 不便なマクロだね。
0264デフォルトの名無しさん
2008/10/28(火) 19:13:22>マクロ内で変数定義した場合、if文抜けたら消えるよね。
どこから「マクロ内で変数定義」なんて話が出てきたんだ?
たとえば
ELEMTYPE(CV_8U) data = array[0];
が
unsigned char data = array[0];
に展開されるようなマクロじゃないのか?
0265デフォルトの名無しさん
2008/10/28(火) 23:35:33>257
0266デフォルトの名無しさん
2008/10/29(水) 00:07:49■ このスレッドは過去ログ倉庫に格納されています