以下の内容はhttps://lipoyang.hatenablog.com/entry/2023/05/11/103439より取得しました。


定数マクロの退避と復帰

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

#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



以上の内容はhttps://lipoyang.hatenablog.com/entry/2023/05/11/103439より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14