1 常量
不變的值更易於理解、跟蹤和分析,所以應該儘可能地使用常量代替變數,定義值的時候,應該把const
作為預設的選項。
規則1.1 使用const常量取代宏
說明:宏是簡單的文本替換,在預先處理階段時完成,運行報錯時直接報相應的值;跟蹤調試時也是顯
示值,而不是宏名;宏沒有類型檢查,不安全;宏沒有範圍。
樣本:
#define MAX_MSISDN_LEN (20) //不好的例子
const int MAX_MSISDN_LEN = 20; //好的例子
規則1.2 一組相關的整型常量應定義為枚舉
說明:之所以使用枚舉,基於:
枚舉比#define或const int更安全,因為編譯器會檢查參數值是否是否位於枚舉取值範圍內,從
而避免錯誤發生。
樣本:
//好的例子:
enum DayOfWeek{sunday,monday, tuesday, wednesday, thursday, friday, saturday};
enum Color{black, blue, white, red, purple};
BOOL ColorizeCalendar(DayOfWeek today, Color todaysColor);
ColorizeCalendar(blue, sunday); //編譯報錯,Blue和Sunday位置錯誤
//不好的例子:
const int sunday = 0;
const int monday = 1;
const int black = 0;
const int blue = 1;
BOOL ColorizeCalendar(int today, int todaysColor);
ColorizeCalendar(blue, sunday); //不會報錯
當枚舉值需要對應到具體數值時,須在聲明時顯示賦值。否則不需要顯式賦值,以避免重複賦值,
降低維護(增加、刪除成員)工作量。
樣本:
//好的例子:S協議裡定義的裝置ID值,用於標識裝置類型
enum TDeviceType
{
DEV_UNKNOWN = -1,
DEV_DSMP = 0,
DEV_ISMG = 1,
DEV_WAPPORTAL = 2
};
程式內部使用,僅用於分類的情況,不應該進行顯式的賦值。
樣本:
//好的例子:程式中用來標識工作階段狀態的枚舉定義
enum TSessionState
{
SESSION_STATE_INIT,
SESSION_STATE_CLOSED,
SESSION_STATE_WAITING_FOR_RSP
};
應當盡量避免枚舉值重複,如必須重複也要用已定義的枚舉來修飾,例如:
typedef enum
{
RTCP_SR = 200,
RTCP_MIN_TYPE = RTCP_SR, //must be lowest known type
RTCP_RR = 201,
RTCP_SDES = 202,
RTCP_BYE = 203,
RTCP_APP = 204,
RTCP_RTPFB = 205,
RTCP_PSFB = 206,
RTCP_XR = 207,
RTCP_RSI = 208,
RTCP_PUBPORTS = 209,
RTCP_MAX_TYPE = RTCP_PUBPORTS //must be highest known type
} rtcp_type_t;
規則1.3 不相關的常量,即使取值一樣,也必須分別定義
說明:一個常量只用來表示一個特定功能,即一個常量不能有多種用途。
樣本:
//好的例子:協議A和協議B,手機號(MSISDN)的長度都是20。
unsigned const int A_MAX_MSISDN_LEN = 20;
unsigned const int B_MAX_MSISDN_LEN = 20;
//或者使用不同的名字空間:
namespace alib
{
unsigned const int MAX_MSISDN_LEN = 20;
}
namespace blib
{
unsigned const int MAX_MSISDN_LEN = 20;
}
建議1.1 儘可能使用const
說明:在聲明的變數或參數前加上關鍵字const用於指明變數值不可被篡改 。類成員函數加上const
限定符表明該函數不會修改類成員變數的狀態。
使用const常見的情境:
函數參數:傳遞引用時,如果函數不會修改傳入參數, 該形參應聲明為const。
成員函數:訪問函數(如get函數);不修改任何資料成員的函數;未調用非const函數、未返回數
據成員的非const指標或引用的函數。
資料成員:如果資料成員在物件建構之後不再發生變化, 可將其定義為const。