#define g_variable 26.5
記號g_variable可能不會被編譯器看到,在進行預處理的時候,g_variable已經被替換成26.5,於是g_variable並未進入符號表,此時執行次變數出現錯誤的提示可能只會提到26.5,若此時g_variable定義在乙個非你寫的標頭檔案裡,此時追蹤他可能浪費一些時間,原因是你使用的名稱未進入symbol table。解決此類方法下:
利用const代替defind,const double g_variable 26.5
g_variable 肯定可以進入符號表,盲目用g_variable替換26.5可能出現object code 出現多分26.5,改用const ,g_variable在記憶體中只保留乙份。
class gameplay
{private:
static const int num=5; //num被封裝在class中,且在靜態儲存區只保留一分記憶體
int scoure[num];
}無法define建立乙個class專屬常亮,defines並不重視scope,一旦被定義,在其後的編譯過程中都有效除非#undef。無法提供任何封裝性。
加入有的編譯允許static整型class常亮完成 in class初值設定,可以改為 the enum hack補償做法。
class gameplay
{private:
enum;
int scoure[num];
}enum hack的行為更像乙個有封裝的define,例如取乙個const的位址是合法的,去乙個enum的位址是不合法的,取乙個defind的位址也是不合法的。加入你不想使用乙個pointer或者reference指向你的整數常亮,enum可以實現你的夢想。enum,defind可能導致記憶體**現重複**。
#define maxfunc f((a)>(b))?(a):(b))
這種長相的巨集用的太多,缺點也太多。
這種巨集的實參一定要加上小括號,或使用do{}while(0)封裝,即使加過小括號也有可能出現不可思議的事情。
int a=5,b=10;
maxfunc(++a,b); //a累加兩次
maxfunc(++a,b+10); //a累加一次
通過inline解決函式巨集定義問題
template
inline void maxfunc(const t& a,const t& b)
此時maxfunc更像乙個函式,遵循scope和訪問許可權,可以寫乙個class private inline函式,而巨集不可以完成此類事情。
敲黑板畫重點:對於單純得變數,最好以const物件或者enum物件代替#define
對於形似函式的巨集。最好用inline函式代替。
你可能不知道的東西
元素可以分為塊級元素,行內元素以及行內塊級元素。行內元素的margin或者padding只有margin left和margin right以及padding left和padding right有效果,margin top margin bottom padding top padding bot...
你可能不知道的const
眾所周知,使用 const 宣告的變數必須同時初始化為某個值。一經宣告,在其生命週期的任何時候都不能再重新賦予新值 const a syntaxerror 常量宣告時沒有初始化 const b 3 console.log b 3 b 4 typeerror 給常量賦值const 宣告只應用到頂級原語...
你可能不知道的python logging機制
先來看幾個例子,先想一下執行結果,答案稍後揭曉 例一 mylogger logging.getlogger mylogger mylogger.info mylogger info mylogger.warning mylogger warning 例二 mylogger logging.getlo...