Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語の衛生的マクロ(Hygienic Macros)とは?識別子の意図しない捕捉とその回避策

衛生的マクロ(Hygienic Macros)とは

本記事では、C言語における「衛生的マクロ(Hygienic Macros)」について解説します。C言語のマクロは、コードの重複を減らして処理を共通化できる便利な機能ですが、書き方を誤ると識別子が意図せず捕捉される(accidental capture)ことで、期待どおりの結果が得られない場合があります。

次のコードは、その典型的な失敗例です。

問題のあるコード例

#include<stdio.h>
#define INCREMENT(i) do { int a = 0; ++i; } while(0)
main(void) {
    int a = 10, b = 20;
    /* aとbに対してマクロを2回呼び出す */
    INCREMENT(a);
    INCREMENT(b);
    printf("a = %d, b = %d\n", a, b);
}

このコードはプリプロセス後に、実質的に次のように展開されます。

#include<stdio.h>
#define INCREMENT(i) do { int a = 0; ++i; } while(0)
main(void) {
    int a = 10, b = 20;
    /* aとbに対してマクロを2回呼び出す */
    do { int a = 0; ++a; } while(0);
    do { int a = 0; ++b; } while(0);
    printf("a = %d, b = %d\n", a, b);
}

実行結果

a = 10, b = 21

出力を見ると、b は 21 に更新されている一方で、a は 10 のまま変化していません。

原因は、マクロ内部で宣言しているローカル変数 a と、呼び出し元の変数 a同名であることにあります。INCREMENT(a) が展開されると ++a というコードが生成されますが、この a はマクロ内で新たに宣言されたローカル変数を指してしまうため、外側の変数 a は一切インクリメントされません。これが「識別子の意図しない捕捉」の典型例です。

衛生的マクロによる解決策

こうした問題を防ぐために使われるのが衛生的マクロ(Hygienic Macros)です。衛生的マクロとは、マクロを展開しても識別子が意図せず捕捉されないことが保証されるように設計されたマクロのことです。

ポイントは、展開先のコードと衝突するおそれのある変数名をマクロ内部で使わないことです。ここでは、マクロ内部の一時変数として、プログラム本体では使用していない別の名前 t を採用しています。

#include<stdio.h>
#define INCREMENT(i) do { int t = 0; ++i; } while(0)
main(void) {
    int a = 10, b = 20;
    /* aとbに対してマクロを2回呼び出す */
    INCREMENT(a);
    INCREMENT(b);
    printf("a = %d, b = %d\n", a, b);
}

実行結果

a = 11, b = 21

今度は a も b も正しくインクリメントされました。マクロ内部の変数名を t に変更しただけで、外側の変数との名前衝突が解消されたためです。

補足:C言語における衛生性の限界

C言語のプリプロセッサは単純なテキスト置換で動作するため、Schemeなどが持つような本格的な衛生的マクロ機構(識別子の自動改名など)は備えていません。そのため実務では、次のような工夫が有効です。

  • マクロ内部の一時変数には、利用者コードで使われない独自の名前を付ける
  • チームで命名規則を定め、衝突のリスクを下げる
  • 可能であれば static inline 関数などでマクロを置き換える

マクロは強力な反面、このような落とし穴を抱えています。「展開後のコード」を常に意識して設計することが、安全なマクロ活用への第一歩となります。

  1. グループポリシーでMicrosoft Officeのマクロ実行をブロックする方法

    Windows 10のグループポリシーを活用すれば、Word、Excel、PowerPointなどのMicrosoft Officeアプリケーションにおいて、インターネットから取得したファイルに含まれるマクロが自動的に開いて実行されるのを防ぐことができます。これにより、マクロウイルスやマクロを狙ったマルウェアファイルによる感染リスクを大幅に低減できます。 Officeマクロとは、Visual Basic(VBA)で記述された小さなプログラムコードのことで、繰り返し行う作業を自動化できる便利な機能です。しかし、この機能は悪用されることも多く、マルウェア作者がコンピューターにウイルスを仕込む手段と

  2. Windows 10でキーボードマクロを作成する方法|ショートカットキー設定の手順を解説

    Windows 10には、目的のアプリへ素早くアクセスするための方法がいくつかあります。スタートメニューやタスクバーへのピン留め、デスクトップへのショートカット作成などが代表的です。しかし、毎日使うアプリであれば、もっと速く開きたいものです。そこで役立つのが「キーボードマクロ」です。タッチスクリーン非搭載のPCを使っている場合や、多ボタンマウスをお持ちでない場合でも、キーボード操作だけで簡単にアプリを起動できます。 マクロとは? コンピューティングにおけるマクロとは、「特定のタスクを実行するために、自動的に一連の命令へと展開される単一の命令」を指します。つまり、キーボードマクロとは、Windo