🐥

#defineで演算を使う場合の注意

2024/10/24に公開

現象

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