- 宏實現
1. 宏定義有可能從未被編譯器看到,找不到宏定義
2. 宏有可能存在多份
#define ASPECT_RATIO 1.653
1. 宏實現函式,必須為宏中所有實參加上(),即使加上也會有被多次呼叫
template<typename T> inline void print(T data) { std::cout << data << std::endl; } #define CALL_WITH_MAX(a,b) print((a)>(b)?(a):(b)) void Test00() { int a(5), b(0); CALL_WITH_MAX(++a, b); //a>b,兩個(a)會執行兩次++a; CALL_WITH_MAX(++a, b + 10); //b>a, 一個(a)執行一次++a; }
- 常量實現
1. 語言常量,編譯器肯定會看到
2. 不會存在多份,減少程式碼量
const double AspectRatio = 1.653;
1. 指標和所指內容均為常量
const char* const authorName = "Scott Meyers";
1. 類作用域的常量至多一份,必須成為static
2. 宏不重視作用域
class GamePlayer00 { private: static const int NumTurns = 5; int scores[NumTurns]; }; class GamePlayer01 { private: enum { NumTurns = 5 }; int scores[NumTurns]; };
1. template inline函式不需要函式本體加(),也不需要擔心引數被核算多次
2. template inline函式遵守作用域和訪問規則
template<typename T> inline void callWithMax(const T& a, const T& b) { print(a > b ? a : b); } void Test01() { int a(5), b(0); callWithMax(++a, b); //a>b,執行一次++a; callWithMax(++a, b + 10); //b>a, 執行一次++a; } int main() { Test00(); Test01(); return EXIT_SUCCESS; }