🐥
#defineで演算を使う場合の注意
現象
Cのコードで、#defineを使ってとある演算をマクロ化していた。
ただどうもこのマクロを含む演算の結果がおかしい。
以下が再現コード
#define CON1 1
#define CON2 2
#define fun CON1 + CON2
int a;
a = 3 - fun
この結果はa = 4になります(0ではない);
原因と対策
まあ原因はマクロのことをよく理解していなかったこと。
#defineはあくまで文字列として置き換えるだけで、関数ではない。
つまり上記の例ではコンパイル前にコードが3 - 1 + 2に置き換えられるだけなので、結果4になる。
3 - (1 + 2)を計算したければ、()も含めて置き換わるようにする。
#define fun (CON1 + CON2)
Discussion