01項 #defineではなく、constとinlineを使おう

C++の復習のために、EffectiveC++を読みます。
一日1項は読みたい

"#defineではなく、constとinlineを使おう"

#defineではなくconstで定数を定義することで、デバッガに情報を表示させられる変数のスコープを用意に定義できる、というメリットがあります。

Visual C++ 2010では、下の画像のように#defineされた定数の値が表示できません。constなら表示できます。
f:id:skru_y:20131017165503j:plain

クラス特有の変数を持たせる場合、#defineでは下のようになります。

class C
{
#define SIZE 100
	char buffer[SIZE];
#undef SIZE
};

constを使えば通常の変数と同じようにに書けます。

class C
{
	static const int SIZE = 100;
	char buffer[SIZE];
};

#defineではなくinlineを使うことで、予期しない動作の実行を防げます型安全にもなります。
本でも紹介されていた例

#define max(a, b) ((a) > (b) ? (a) : (b))


int a=5, b=0;
max(a++, b);

のコードを書くと、aが2回インクリメントされてしまいます。
inline関数template関数を使えば安全です。


参考書籍

Effective C++ 【改訂第2版】      アスキーアジソンウェスレイシリーズ―Ascii Addison Wesley programming series

Effective C++ 【改訂第2版】 アスキーアジソンウェスレイシリーズ―Ascii Addison Wesley programming series