Posted at

マクロの扱いには気を付けろ! ver.2

More than 3 years have passed since last update.

昨日の続きです。

【cocos2d-x】マクロの扱いには気を付けろ! ver.1


マクロはテキスト置換である(続き)

昨日書き忘れたことがあったので一つ追加します。

(しばらくしたら前の記事に追加しようかな。)

マクロはテキスト置換であると前回の記事で述べました。

マクロが使われた時はプリプロセッサがそれを解釈し、置換を行います。

これはつまり値のコピーがその都度行われると言う事です。

一般的に、これもマクロを使う人が想定している事態ではないでしょう。


マクロにはスコープと言う概念がない

※参考

Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

例えばヘッダファイル内に#defineで定義したマクロがあるとします。

これはこのヘッダファイルをインクルードさえすれば使えてしまうということです。

なので、クラスの定数と言う意味合いで作ることは出来ません。

なので、マクロを作成した人が想定した用途以外で使われうる事を念頭に置いておくべきかもしれませんね。


例えば・・・

以下の様なクラスがあったとします。

#define MARGIN 20

class MarginedBox {
// ...
};

MarginedBoxは二つのボックスを一定のMARGINで置くためのクラスだとしましょう。

このMARGINは20だと決まっていました。

もちろんこのクラスで使うことしか考えていません。

ある日、全く別のプログラマが全く別のNode上にラベルとラベルの間をmargin20で配置したいと考えました。

マジックナンバーは嫌なので定数化したいと考えます。

調べてみたらMARGIN 20があった。

よし、これを使おう。

...しばらくするとデザイン変更があり、MarginedBoxのMARGINは30にしようとなりました。

もうどうなるかわかりますね。

かなり極端な例ですが、自クラス内だけで使う定数はprivateに抑えておくべきで、外から使えるようにすべきではありません。

どうすれば良いかというとこの例だとprivateのconstで定数化するのが良いですね。

class MarginedBox {

private:
static const int margin = 20;
};

誰かのお役に立てば。