C++編程規範之16.避免使用宏
摘要:
宏是C和C++語言的抽象設施中最生硬的工具,它是披著函數外衣的饑餓的狼,很難馴服,它會我行我素地遊走於各處。要避免使用宏。
這一點在effective C++中也進行了解釋。C++的宏的主要問題在於,他們表麵上看起來很好,而實際上做的卻是另一回事。宏會忽略作用域,忽略類型係統,忽略所有其他的語言特性和規則,而且會劫持它為文件其餘部分所定義的符號。宏調用看上去很像符號或者函數調用,但實際上並非如此。宏不太“衛生”,也就是說,它會根據自己所使用時所處的環境引人注目而且令人驚訝地展開為各種東西。宏需要進行文本替換,因此編寫遠距離也正確的宏接近於一種魔法,而精通這種魔法既無意義也無趣。
即使在極少情況下,有正當理由編寫宏,也絕不要考慮編寫一個以常見詞或者縮略詞為名字的宏。盡可能快地消除宏的定義,總是給他們取很明顯的、大寫的、很難看的名字,並且不要放在頭文件中。
例外情況:
1. 宏仍然是幾個重要任務的唯一解決方案,比如#include保護符,條件編譯中的#ifdef和#if _defined,以及assert的實現。
2. 在條件編譯中,要避免在代碼中到處雜亂地插入#ifdef.相反,應該對代碼進行組織,利用宏來驅動一個公共接口的多個實現,然後始終使用該接口。
3.如果不想到處複製和粘貼代碼段,那麼可以使用宏。
最後更新:2017-04-03 12:53:43