#defineでマクロを書くときは気を付けないと危険です。
例えば、
#define hoge(X) if (X==0) {} elsif (X==1) {}
hoge(++N);
インクリメントされたNではなく「++N」自体が渡される為、
評価される度に値が変わってしまいます。
もう一つ。
#define hoge(X)\
(sin(X) + cos(X));
int n = hoge(100) + 100;
修正を繰り返すうちに残してしまったんだと思いますが、敵は#defineディレクティブの最後のセミコロンです。
展開されると+100は単独式として評価されて、nは意図した値になりません。
コンパイラによってはWarningも何もないのでお気を付けください(;´ω`)