グローバル変数管理マクロを考える

「グローバル変数管理マクロ」と書くと、何のことか分からない方も少なくないと思います。他に適切な用語が思い浮かばなかったので、とりあえずこのような名前にしましたが、要するに次のようなマクロ定義のことです。

#ifndef GLOBAL_DEFINE
#define EXTERN  extern
#else
#define EXTERN
#endif

ここで、使われているマクロ名は何でもかまいません。上記のようなマクロを使って、グローバル変数の定義と外部宣言の記述を楽にしようというものを、ここでは「グローバル変数マクロ」と呼ぶことにします。

このテクニックは、いろいろな書籍やウェブサイトなどでも紹介されており、実際に使っている方も少なくないことでしょう。しかし、どうしてもこのマクロには違和感があります。私はゴローバル変数全廃論者ではありませんが、だからといってグローバル変数の使用を推奨するわけではありません。無理なくグローバル変数の使用を避けられる状況であれば、迷わず別の手段を使うべきです。

しかし、「グローバル変数管理マクロ」を用意することは、グローバル変数を導入しやすくするためのものです。この趣旨に賛同することはできません。なるべく避けるべき手法には、なるべく汚く、書くのが面倒なシンタックスを用意するのが正攻法ではないでしょうか?

ところで、グローバル変数を簡単に管理することが目的であれば、こんなマクロを導入しなくても、もっとよい方法があります(下記の方法によって、グローバル変数導入の免罪符とすることを推奨するわけではありません)。

/* global.h */
struct global {
  int hoge;
  int bar;
  ...
};
extern struct global global;
 
 
/* global.c */
#include "global.h"
struct global global;

とでもしておけば、個々の名前は構造体のメンバーとして1回記述するだけで済みます。C++なら、この構造体にコンストラクタを設けてやれば、個々のメンバーに初期値を与えることも容易になります。そして、グローバル変数にアクセスするときは、global.hogeのように記述するわけですから、g_のような接頭辞を付けるより、もっと強力にグローバル変数であることをアピールします。

この件に関してはもっと思うところがありますが、今日のところはとりえずこのぐらいで。

この記事のトラックバックURL:

http://www.kijineko.co.jp/trackback/507
このエントリーを含むはてなブックマーク