你可能不知道得define

2021-09-24 06:35:31 字數 1349 閱讀 5278

#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...