定数マクロの退避と復帰

定数マクロの弊害として、スコープに関係なく置換されるため、意図しない所でエラーになることがあります。

#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