■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回インクリメントされてしまう。