C++中宏的使用問題詳解
宏不遵循C++中關(guān)于范圍和類型的規(guī)則。這經(jīng)常導(dǎo)致一些微妙的或不那么微妙的問題。因此,C++提供更適合其他的C++(譯注:原文為the rest of C++,當指C++除了兼容C 以外的部分)的替代品,例如內(nèi)聯(lián)函數(shù)、模板與名字空間。
考慮一下:
#include "someheader.h" struct S { int alpha; int beta; };
如果某人(不明智地)地寫了一個叫“alpha”或“beta”的宏,那么它將不會被編譯,或者被錯誤地編譯,產(chǎn)生不可預(yù)知的結(jié)果。例如,“someheader.h”可能包含:
#define alpha 'a' #define beta b[2]
將宏(而且僅僅是宏)全部大寫的習(xí)慣,會有所幫助,但是對于宏并沒有語言層次上的保護機制。例如,雖然成員的名字包含在結(jié)構(gòu)體的內(nèi)部,但這無濟于事:在編譯器能夠正確地辨別這一點之前,宏已經(jīng)將程序作為一個字符流進行了處理。順便說一句,這是C 和C++程序開發(fā)環(huán)境和工具能夠被簡化的一個主要原因:人與編譯器看到的是不同的東西。
不幸的是,你不能假設(shè)別的程序員總是能夠避免這種你認為“相當白癡”的事情。例如,最近有人報告我,他們遇到了一個包含goto 的宏。我也見過這種情況,而且聽到過一些——在很脆弱的時候——看起來確實有理的意見。例如:
#define prefix get_ready(); int ret__ #define Return(i) ret__=i; do_something(); goto exit #define suffix exit: cleanup(); return ret__ void f(){ prefix; // ... Return(10); // ... Return(x++); //... suffix; }
作為一個維護的程序員,就會產(chǎn)生這種印象;將宏“隱藏”到一個頭文件中——這并不罕見——使得這種“魔法”更難以被辨別。
一個常見的微妙問題是,一個函數(shù)風格的宏并不遵守函數(shù)參數(shù)傳遞的規(guī)則。例如:
#define square(x) (x*x) void f(double d, int i){ square(d); // 好 square(i++); // 糟糕:這表示 (i++*i++) square(d+1); //糟糕:這表示(d+1*d+1); 也就是 (d+d+1) // ... }
“d+1”的問題,可以通過在“調(diào)用”時或宏定義時添加一對圓括號來解決:
#define square(x) ((x)*(x)) /*這樣更好 */
但是, i++被執(zhí)行了兩次(可能并不是有意要這么做)的問題仍然存在。
是的,我確實知道有些特殊的宏并不會導(dǎo)致C/C++預(yù)處理宏這樣的問題。但是,我無心去發(fā)展C++中的宏。作為替代,我推薦使用C++語言中合適的工具,例如內(nèi)聯(lián)函數(shù),模板,構(gòu)造函數(shù)(用來初始化),析構(gòu)函數(shù)(用來清除),異常(用來退出上下文環(huán)境),等等。
好了,今天就先到這里,以后我們再來更深入的探討這個問題
相關(guān)文章
C++?數(shù)據(jù)結(jié)構(gòu)超詳細講解單鏈表
這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)之單鏈表,鏈表是由一個個結(jié)點鏈結(jié)成的。結(jié)點包括數(shù)據(jù)域和指針域兩部分,數(shù)據(jù)域用來存儲數(shù)據(jù)元素的信息,指針域用來存儲下一個結(jié)點的地址,更詳細內(nèi)容請需要的小伙伴參考下面文章內(nèi)容2022-03-03C++ sdl實現(xiàn)渲染旋轉(zhuǎn)視頻的方法分享
一般情況下播放視頻時不需要旋轉(zhuǎn),但是如果是移動端錄制的視頻有時會出現(xiàn)rotate參數(shù),且視頻寬高也是互換的。所以本文為大家準備了利用sdl實現(xiàn)渲染旋轉(zhuǎn)視頻的方法,需要的可以參考一下2022-12-12windows下在vim中搭建c語言開發(fā)環(huán)境的詳細過程
這篇文章主要介紹了windows下在vim中搭建c語言開發(fā)環(huán)境,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-05-05C語言實現(xiàn)簡單學(xué)生選課管理系統(tǒng)
這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單學(xué)生選課管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-02-02