雖然c++一直在強調盡量少用巨集,但是巨集確實是個好東西,會使**很簡潔,使人欲罷不能。
近期出現乙個無法理解的異常,找了很長時間,結果發現是呼叫的別人的巨集導致的,差點**。
實際工作中,日誌是定位程式錯誤的常用手段之一。不同等級的日誌輸出,代表不同的錯誤級別,有一些僅僅是警告,對程式執行無任何影響,則只需要列印出來即可;但有一些是嚴重的錯誤,會對後續程式的執行影響很大,除了列印資訊外,最好還能直接斷言,提示開發人員。
程式實際執行時,一般錯誤日誌都是寫到日誌檔案中;而開發環境下,直接列印到控制台更方便檢視。想要實現這個功能,用巨集來控制再方便不過。
開發環境visual studio 2013, **如下:
#include #include #ifdef _debug
#define log_i(x) std::cout << "警告:" << x << std::endl
#define log_e(x) std::cout << "錯誤:" << x << std::endl; assert(false)
#else
//有關檔案的操作省略
#endif
int _tmain(int argc, _tchar* ar**)
這裡很簡單,如果定義了_debug巨集,即開發除錯環境,則將日誌列印到控制台;否則,將日誌寫到對應檔案中(簡單起見,此處省略)。注意,巨集定義最後面是沒有分號的。
編譯執行,結果如下:
log_e巨集除了列印錯誤日誌外,還會觸發斷言,這裡這樣使用沒任何問題。
但是,日誌的列印,一般都會有條件判斷,即某錯誤條件成立後,才列印日誌。**調整如下:
#include #include #ifdef _debug
#define log_i(x) std::cout << "警告:" << x << std::endl
#define log_e(x) std::cout << "錯誤:" << x << std::endl; assert(false)
#else
//有關檔案的操作省略
#endif
int _tmain(int argc, _tchar* ar**)
執行,輸入1,結果如下:
和預想的一致,似乎沒什麼問題。但是如果輸入的2,什麼情況呢?
納尼?發生了什麼?
仔細看**,用具體**替換掉巨集,if語句的**就是如下:
問題就出在log_e巨集上,裡面有多條語句。展開後,只有第一條語句在else作用域內,第二條則一定會指定。
想要解決該怎麼辦?有兩種方式:
1、在條件判斷語句後面加上{}
調整後的**如下:
#include #include #ifdef _debug
#define log_i(x) std::cout << "警告:" << x << std::endl
#define log_e(x) std::cout << "錯誤:" << x << std::endl; assert(false)
#else
//有關檔案的操作省略
#endif
int _tmain(int argc, _tchar* ar**)
else
system("pause");
return 0;
}
執行後結果如下:
結果正確!
但如果你是巨集的設計者,則需要為你設計的巨集負責,用下面的方式更合適。
2、多條語句的巨集,用{}將多條語句括起來
修改**如下:
#include #include #ifdef _debug
#define log_i(x) std::cout << "警告:" << x << std::endl
#define log_e(x)
#else
//有關檔案的操作省略
#endif
int _tmain(int argc, _tchar* ar**)
執行結果如下:
沒問題!
有關巨集的使用,一定要謹慎,特別是和條件判斷語句搭配使用。
巨集後面是否有";"也需要注意,和條件語句一起,也可能產生意想不到的問題。
C 基礎之巨集的使用
在c c 中經常可以看到各種巨集,現對巨集的妙用做一些使用總結。一 防止標頭檔案的重複包含 ifndef x h define x h endif 二 條件編譯,根據條件選擇性編譯插入 ifdef unicode define t x l x 如果定義了 unicode巨集則使用l把字串連線起來,譬...
swiper的基礎使用(十二)
本節內容介紹swiper當中如何將導航變為滾動條樣式。首先我們搭建乙個swiper頁面的基本布局。h5edu 2 h5edu 3 h5edu 4 h5edu 5 h5edu 6 h5edu 7 h5edu 8 h5edu 9 然後到js部分新增初始化 var swiper new swiper sw...
c 巨集的使用
習慣上,巨集定義的最後一句話,不加 這樣的話,我們在使用巨集的時候就需要在後面加上 與一般的c 語法一致 1 有一些類我們不允許copy and assign,在這種情況下,我們可以使用巨集來解決這個問題 一般方法 這是在.h檔案的巨集定義,在特定的類宣告中,加入巨集即可 define disabl...