定数マクロの弊害として、スコープに関係なく置換されるため、意図しない所でエラーになることがあります。
#include<stdio.h> #define HOGE 666 int main() { printf("HOGE = %d\n", HOGE); int HOGE = 314; // ← HOGEが666に置換され、エラー printf("HOGE = %d\n", HOGE); return 0; }
言うまでもなく、エレガントな解決策は定数マクロを const に置き換えることです。
#include<stdio.h> const int HOGE = 666; int main() { printf("HOGE = %d\n", HOGE); int HOGE = 314; printf("HOGE = %d\n", HOGE); return 0; }
実行結果
HOGE = 666 HOGE = 314
しかし、この定数マクロが自分に権限の無いソース (他人のライブラリ等) で定義されているものだったら? あるいは広範囲におよぶ影響の可能性に責任を持てない場合は?
エレガントではありませんが、回避策として定数マクロの退避・削除と復帰という方法があります。
#include<stdio.h> #define HOGE 666 int main() { printf("HOGE = %d\n", HOGE); #pragma push_macro("HOGE") // マクロの退避 #undef HOGE // マクロの削除 int HOGE = 314; printf("HOGE = %d\n", HOGE); #pragma pop_macro("HOGE") // マクロの復帰 printf("HOGE = %d\n", HOGE); return 0; }
実行結果
HOGE = 666 HOGE = 314 HOGE = 666