條款02: 儘量以const,enum,inline 替換 #define

博瑜图形發表於2024-09-07
  • 宏實現

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;
}

相關文章