■defineではなくconstとinlineを使用する

#include <iostream>
using namespace std;

const char * const cat = "Cute Cat";

int main()
{
	cout << "The Very " << cat << endl;
	
	return 0;
}

文字列をconstする場合、ポインタとポインタが指すデータの両方をconstしなければならない。


#include <iostream>
using namespace std;

#define max(a, b) ( (a) > (b) ? (a) : (b) )
template<class T> inline const T& maxT(const T& a, const T& b) { return a > b ? a : b; }

int main()
{
	int a, b;

	a = 5;
	b = 0;

	cout << max(++a, b) << " a: " << a <<endl; // a が2回インクリメントされてしまう

	a = 5;
	b = 0;

	cout << max(++a, b+10) << " a: " << a << endl; // a が1回インクリメント
	
	a = 5;
	b = 0;

	cout << maxT(++a, b) << " a: " << a << endl; 

	return 0;
}

max(++a, b)はコンパイル時に(++a) > (b) ? (++a) : (b) )と書き換えられてしまう為、2回インクリメントされてしまう。