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