[表示 : 全て 最新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)

から。

2 名前:デフォルトの名無しさん mailto:sage [2006/04/12(水) 15:55:07 ]

× >>1 とりあえず、頭は簡単な
○ >>1 俺はゴミマクロ。
○     さあ早く優秀なマクロおくれよ〜〜(クレクレクレクレ


3 名前:デフォルトの名無しさん mailto:sage [2006/04/12(水) 16:53:10 ]
#define TRUE 1
#define FALSE 0

4 名前:デフォルトの名無しさん mailto:sage [2006/04/12(水) 17:07:15 ]
#define FALSE 0
#define TRUE ~FALSE

5 名前:デフォルトの名無しさん mailto:sage [2006/04/12(水) 17:21:20 ]
>>1
#define DEG_2_RAD(n) ((n) * PI / 180.0f)

の方が良くない?

6 名前:デフォルトの名無しさん mailto:sage [2006/04/12(水) 17:25:37 ]
#define STATIC_ASSERT(expr) { char dummy[(expr) ? 1 : 0]; }

7 名前:デフォルトの名無しさん mailto:sage [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
× の方が良くない?
○ とするべき。

8 名前:デフォルトの名無しさん mailto:sage [2006/04/12(水) 19:37:20 ]
#define DQN ">>1"

9 名前:デフォルトの名無しさん mailto:sage [2006/04/12(水) 19:41:05 ]
#define NOP 0

10 名前:デフォルトの名無しさん mailto:sage [2006/04/12(水) 19:43:28 ]
>>6
初めて知りました。
が、これだと偽でもコンパイル通っちゃわない?
 #define STATIC_ASSERT(expr) { char dummy[(expr) ? 1 : -1]; }
ではないかと思うんだけど…



11 名前:デフォルトの名無しさん mailto:sage [2006/04/12(水) 22:30:34 ]
C言語でstatic assertなぞ滅多に使わないから、コンパイルとおっても大丈夫

12 名前:デフォルトの名無しさん [2006/04/13(木) 01:09:07 ]
#define SWAP(a,b) { int temp; temp = a; a = b; b = temp;}

13 名前:デフォルトの名無しさん mailto:sage [2006/04/13(木) 08:39:06 ]
VC8.0でMSCRTに_countofマクロ追加されたよな。

hoge.h
#ifndef HOGE_H
#define HOGE_H
/*******/
#endif

14 名前:デフォルトの名無しさん mailto:sage [2006/04/13(木) 22:20:05 ]
#define offsetof(s,m) (size_t)&(((s *)0)->m)


#define __STR2__(x) #x
#define __STR1__(x) __STR2__(x)
#define __LOC__ __FILE__ "("__STR1__(__LINE__)") : "

15 名前:デフォルトの名無しさん mailto:sage [2006/04/14(金) 12:04:52 ]
>>14
offsetof って標準C にあるんだけどね。C99 からだっけ?

16 名前:デフォルトの名無しさん mailto:sage [2006/04/14(金) 22:44:02 ]
>>14
__LOC__ マクロすごいな
__STR1__、__STR2__ と2段にしないといけないのは、どういう仕組みになってるんだろう?
わかる人いる?

17 名前:デフォルトの名無しさん mailto:sage [2006/04/15(土) 00:09:50 ]
__LOC__が意図どおりになるかはコンパイラによる。
__LINE__はマクロの皮を剥いでも、数字にならない場合がある。

18 名前:デフォルトの名無しさん mailto:sage [2006/04/15(土) 01:05:56 ]
定数はenumつかおうぜー

19 名前:デフォルトの名無しさん mailto:sage [2006/04/17(月) 09:41:50 ]
>>18なんで?

20 名前:デフォルトの名無しさん mailto:sage [2006/04/17(月) 10:27:54 ]
enumならデバッガが拾ってくれるからとかどうたらこうたら



21 名前:デフォルトの名無しさん mailto:sage [2006/04/17(月) 21:23:16 ]
enumだと整数縛りだから…

22 名前:デフォルトの名無しさん [2006/04/19(水) 19:02:13 ]
enumはenum以外の何者でもなさげ

あ、C++じゃなくてCだから安心して整数扱いできるのか。

23 名前:デフォルトの名無しさん mailto:sage [2006/04/19(水) 19:15:33 ]
おいコラ、どっからC++の話が出てくるんだよ

24 名前:デフォルトの名無しさん mailto:sage [2006/04/19(水) 19:24:09 ]
>>1を読む限りC++も含めてネタ出しOKのようだが

25 名前:デフォルトの名無しさん mailto:sage [2006/04/19(水) 21:02:25 ]
Boost.Preprocesser

26 名前:23 mailto:sage [2006/04/19(水) 21:29:44 ]
ホントだ。スマソ

27 名前:デフォルトの名無しさん mailto:sage [2006/04/20(木) 04:32:25 ]
#define iskanji(c) ((c)>=0x81 && (c)<=0x9F || (c)>=0xE0 && (c)<=0xFC)
#define iskanji2(c) ((c)>=0x40 && (c)<=0xFC && (c)!=0x7F)

28 名前:デフォルトの名無しさん mailto:sage [2006/04/20(木) 21:26:21 ]
ShiftJISは死んでほしい。

29 名前:デフォルトの名無しさん mailto:sage [2006/04/20(木) 22:11:45 ]
よし、Unicodeだ!

30 名前:デフォルトの名無しさん mailto:sage [2006/04/22(土) 03:17:57 ]
将来的にはSJISは無くなるから大丈夫。



31 名前:デフォルトの名無しさん mailto:sage [2006/04/23(日) 11:15:18 ]
何十年後だろう

32 名前:デフォルトの名無しさん mailto:sage [2006/04/23(日) 14:54:23 ]
#define _LABEL(X,Y) __##X##__##Y##__
#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;
}


33 名前:デフォルトの名無しさん mailto:sage [2006/04/23(日) 22:53:06 ]

    [ ゚д゚]y-~~~ デフラグガカンリョウシマシタ
    /[へへ
!!""""############(((((((((((((((())))))))))))))))
****,,,,,////00::;;;;;;AAAAAAAAABBBBBBBBBBBBCCCCCCCEEEEEEEEEEEEEGIIIIKKKKKKKLLLLLLLL
LLLLLLLLLLLLNNNNNNNNOOOOOOOORRRRTTTTUUUUXXXXXYYYYY\\___________aaddddddeeeeeeeee
eeeeefffffffffggiiiiiiiiilmnnnnnnnnnnnnnoooooooppprrrrrsstttttttu{{{}}}

34 名前:デフォルトの名無しさん mailto:sage [2006/04/28(金) 10:45:14 ]
マクロでtry-catch実装するやつ。使える。

35 名前:デフォルトの名無しさん [2006/05/20(土) 20:05:27 ]
age

36 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 20:15:08 ]
#define begin {
#define end }

37 名前:デフォルトの名無しさん [2006/05/20(土) 20:19:41 ]
>>36
絶対誰かが書くと思っていた

38 名前:デフォルトの名無しさん [2006/05/20(土) 20:20:36 ]
#define until while!(
#define ifn if!(
#define loop for(;;){

ところで define でググると「#define」って同人サークルのサイトがトップに来るのな。
予約語をサークル名(サイト名)にするとは考えたな。
俺もなんかの予約語でWebサイト作ればウハウハかな?

39 名前:デフォルトの名無しさん [2006/05/20(土) 20:22:06 ]
おっと loop は for(;;) だけでよかった

40 名前:デフォルトの名無しさん [2006/05/20(土) 20:22:33 ]
C/C++のマクロってホントださいよね
Lispサイコー



41 名前:デフォルトの名無しさん [2006/05/20(土) 20:25:27 ]
インライン関数じゃだめ?


ところでこのスレタイは「便利なマクロ@C言語」が正しいんじゃないかと思うんだが。。。

42 名前:デフォルトの名無しさん [2006/05/20(土) 20:27:36 ]
基本だけど
#if 0
#else
でコメントアウト。
/* */と違ってネストできる。

43 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 20:34:33 ]
for(;;)よりwhile(1)が好きだな

44 名前:デフォルトの名無しさん [2006/05/20(土) 20:38:25 ]
最適化されないコンパイラだといちいち1が0以外であることを比較してしまいそうだ

45 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 21:00:10 ]
>>38
>if!(
>while!(
( ´,_ゝ`)
初心者がマクロを使うとろくな結果にならない典型ですね。

46 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 21:09:38 ]
>>45-46
バカにつっこむバカの典型

47 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 21:16:06 ]
>>46は自虐的だな

48 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 21:36:53 ]
#define loop for(;;){
の一行も怪しくないか?
loop{sum++;}にしたらとっても美味しくないぞ

49 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 21:47:52 ]
#define if if(rand()%3) if

50 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 22:35:10 ]
>>49
とっても便利だ




51 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 22:35:41 ]
何に使うの?

52 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 22:44:27 ]
嫌がらせ

53 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 22:46:51 ]
C言語@糞マクロ にタイトル変えろ

54 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 23:02:06 ]
ここは実践で使えない糞マクロを上げるスレでつねw

55 名前:デフォルトの名無しさん [2006/05/20(土) 23:30:27 ]
能無しが噛み付いてるw

56 名前:デフォルトの名無しさん mailto:sage [2006/05/21(日) 00:07:17 ]
static assert

static void SASSERT_(void *) { }
#define SASSERT(b) SASSERT_(!(b))

b が静的な真値定数なら
引数が 0 になってヌルポインタとして扱えるため
コンパイルが通る。
何も処理しないため、最適化で削除される。

b が静的な偽値定数なら
引数が 1 になってポインタとして扱えないため
コンパイルに失敗する。

57 名前:デフォルトの名無しさん mailto:sage [2006/05/21(日) 01:47:27 ]
>>56
>>6

58 名前:デフォルトの名無しさん mailto:sage [2006/05/21(日) 02:02:29 ]
>>57
>>56 はコンマ演算子で繋げば式中で使える。
値に置換されるようなマクロの
引数チェックに使ったりできる。

>>6 は文としてしか使えないから、
>>56 より適用範囲が狭い。

59 名前:デフォルトの名無しさん mailto:sage [2006/05/21(日) 06:40:51 ]
>>58
確かに式として使えるけど
コンパイルエラーを検出したいだけなのに
そんなにメリットがあるの?
if(SASSERT(CHAR_BIT==8)) {
}
のようにifで囲っても見辛くなるだけだし、
コンマ演算子で繋げるっていっても
SASSERT(sizeof(int)==4),SASSERT(sizeof(void*)==4),・・・;
とかしても可読性が下がるだけような…(いずれも自分的には)
何か良い使い方があるなら教えて。

60 名前:デフォルトの名無しさん mailto:sage [2006/05/21(日) 06:53:40 ]
>>59
#define BIT(n) (1u << (n))

というマクロがあるとする。
これを、n を静的な定数に制限する代わりに
静的に n の値をチェックしてくれるようにしたいとする。
こういう場合にこのタイプの SASSERT が使える。

#define SBIT(n) (SASSERT(0 <= (n) && (n) < CHAR_BIT * sizeof (unsigned)), 1u << (n))

静的だから n に副作用はないから
n が複数出る事に問題は無い。



61 名前:59 mailto:sage [2006/05/21(日) 07:56:04 ]
>>60
それは(・∀・)イイ!!
と思ったけど自分の環境だと
例えば
int x=SBIT(-1);
int y=SBIT(16);
int z=SBIT(100);
として、
Cソースとしてコンパイルすると
警告が出るだけでコンパイルが通っちゃうし、
C++ソースとしてコンパイルすると
どれもboolからvoid*へ変換できないって
エラーが出てしまう。(;´Д`)

62 名前:デフォルトの名無しさん mailto:sage [2006/05/21(日) 08:17:00 ]
Cはvoid*に対する扱いが緩すぎて、こういう用途には向かないな。
全環境に-Wallを付けさせるわけにもいかないし…
C++は逆にvoid*に厳しすぎて使えない。
C++ならtemplateを使って実現出来るから、そっちを使った方が
エラーメッセージの質から考えてもいいだろうけど。

63 名前:デフォルトの名無しさん mailto:sage [2006/05/21(日) 09:10:03 ]
静的と言いながら引数に変数を指定できてしまうのも問題だな。
>>6なら変数を指定しても標準C/C++ならエラーになるし。

64 名前:デフォルトの名無しさん mailto:sage [2006/05/21(日) 09:22:13 BE:59908526-#]
>>3-4

TRUEとかFALSEとか定義せずに、そのまんま数値を使えよって、最近は思うようになった。

65 名前:デフォルトの名無しさん mailto:sage [2006/05/21(日) 09:29:41 ]
>>64
つ[stdbool.h]

66 名前:デフォルトの名無しさん mailto:sage [2006/05/21(日) 10:13:21 ]
>>61
>C++
なるほど。確かに bool になっちゃうね。

#define SASSERT(b) SASSERT_((b) ? 0 : 1)

にすればOKか。

>>63
変数入れれば警告はされる。
エラーじゃないのは・・・仕方が無い。

67 名前:デフォルトの名無しさん mailto:sage [2006/05/21(日) 10:33:33 ]
C は結構緩いんだな。
ポインタに int 代入して警告ですむなんて。
というわけで、折衷案を考えた。

void SASSERT_(int(*p)[1]) { }
#define SASSERT(b) SASSERT_((int(*)[(b) ? 1 : -1])0)

キャストだけでもいいんだけど、
単独で使うと、意味の無い式だっていう警告が出てウザいから、
ダミーの関数を通すようにした。

68 名前:デフォルトの名無しさん mailto:sage [2006/05/21(日) 10:34:11 ]
×意味の無い式
○意味の無い文

間違えた。

69 名前:デフォルトの名無しさん [2006/05/31(水) 09:21:50 ]
あげ

70 名前:デフォルトの名無しさん [2006/06/01(木) 20:02:45 ]
#define block if(1)for(int i=0;i<1;i++)

void main()
{
block
{
printf("foo\n");
break;
printf("bar\n");
}
}

実行結果:
>foo
>



71 名前:デフォルトの名無しさん mailto:sage [2006/06/01(木) 20:05:04 ]
>>70
必要性をまったく感じないんだが…

72 名前:デフォルトの名無しさん [2006/06/01(木) 20:13:09 ]
breakで抜けられる、continueでblockの頭に戻れる、ぐらいかなあ。
既存のgoto使ったコードからむりやりgoto排除するには使えるかも。
でもC++じゃあねえ、そもそもそんなことしないか。

73 名前:デフォルトの名無しさん mailto:sage [2006/06/01(木) 20:58:44 ]
というかif(1)の意味がわからない。
カビの生えたコンパイラ対策ならif(0){}else ifだろうし
>>72
continueしても++iで結局脱出

74 名前:72 mailto:sage [2006/06/01(木) 22:49:13 ]
>>73
おー、そうでした。
ますます>>70の真意が分からない…

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__ マクロがあるから、
「コンパイルごとに違う値が出る」というのだけを実現する事は可能。
ただし、こいつらどっちも文字列だから、
そこから得た値を使って配列のサイズに指定したりとか、そういうのは無理だけど。








[ 続きを読む ] / [ 携帯版 ]

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

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