接續前一天的內容,繼續來看enum與inline應該在哪邊取代掉#define。
來看看以下範例:
class GamePlayer{
private:
enum
{
NumsTurns = 5
};
int score[NumTurns];
這是做啥?利用Enum可以被用在compile的時候需要用int的地方的特性,就可以解決前面提到的如果比較早期的編譯器被迫不能在宣告時定義值的時候拿來用。
知道"enum hack"有什麼好處?
還有一個不該使用#define的地方就是把一些像是function的用法塞到#define,
範例:
#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))
這時就可以使用"inline"來取代:
template<typeName T>
inline void callWithMax(const T&a, const T&b)
{
f(a>b?a:b);
}
好處:
貼心重點提醒:
- For simple constants, prefer "const" objects or enums to #define
- For function-like macros, prefer inline functions to #define
簡單來說就是看一下#define用在哪,如果是簡單的常數,可以考慮直接用const取代掉;如果是比較複雜的function,就用inline functions。總之就是把一些preprocessor時就做掉的行為延到compiler,避免程式compile時難以追溯的錯誤。
(皆取自參考資料)