2009年2月17日火曜日

C言語のマクロ

1、2重比較を注意しましょう。
例:
#define isalpha(s) if((s) > 'a' && (s) < 'Z')
isalpha(*s++);
結果は?

2、C言語アスキー文字コード判別ライブラリの実装例

インデックス 0 0x32 0x7b

_ctype+1[]
+---+-------+----+-------+----+---+---+---+
|0--|-------|0x01|.......|0x02|...|...|...|
+---+-------+----+-------+----+---+---+---+

文字コード EOF 'A' ↑ 'z'


各ビットの定義
8 7 6 5 4 3 2 1 0
+-----+-----+-----+-----+-----+-----+-----+-----+
|-----|-----|-----|-----|-----|0-9 |a-z |A-Z |
+-----+-----+-----+-----+-----+-----+-----+-----+

3、文字列処理の落とし穴
例:
#define debug(s) sprintf("message is %s", s)

debug(message[0]);

結果は:sprintf("message is %message[0]", message[0]);


4、文字列処理記号”#”と”##”

# は、引数を文字列に変換する。

#define string(x) #x

string(Hello World)

"Hello World"

## は二つの識別子を連結させる。

#define comb(x, y) x ## y

comb(hello, world)

helloworld

0 件のコメント: