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文字列を数値に変換するマクロって無かったっけ?
■ このスレッドは過去ログ倉庫に格納されています