在c++中,巨集是乙個非常好用的預處理功能,同時,它又有一些不好的地方,特別是用#define來實現macros,如果你這樣做的話,你肯定要為每個引數都加上小括號,否則你懂得。但是這樣仍然存在問題,說乙個最近看到的例子:
/*求兩個變數中最大的那個*/
#define the_max(a, b) f((a) > (b) ? (a) : (b))
看著就頭疼好吧- -!
當你這樣用的時候:
the_max(++
a,++
b);
如果有人這樣使用了這個巨集,那麼很明顯的是,a和b總有乙個會多累加一次。
那先總結一下#define的缺點吧,優點就不說了- -!
#define不重視scope的概念,或者說沒有,一旦被定義,就一直有效,除非在某個地方被#undef;
由於1的原因,#define不提供封裝性,也就沒有private這種許可權之類的;
由於是預處理命令,所以定義的符號不會進入符號表內,對於除錯的過程,很可能會讓你頭疼;
1.對於#define i_var 123
const int ivar = 123可以替換上面的巨集
有兩個需要注意的地方:
(1) 當定義的是常量指標,需要const兩次( const char* const ivar = "c++"),第乙個const是防止值被改變,第二個const防止位址被改變。
(2) 當定義到class內時,需要用static來修飾這個變數,防止出現多個實體,**如下:
class a ;
還有乙個需要說一下,有些編譯器需要你在.cpp檔案內去定義這個常量:a::ivar;
由於宣告時已經指定了值,所以定義時不要再去賦值,當然你也可以在宣告時不指定任何值,而在定義時在確定這個值。
2. 對於#define func(a, b) f((a) > (b) ? (a) : (b))
可以寫乙個inline函式來替代:
template
inline
void func(const t& a, const t& b)
c預編譯 define相關
是生成字串 define a x x a bc bc 是連線 define a x abc x a 123 abc123 error是生成編譯錯誤訊息 ifdef abc error something wrong.endif 如果abc是已經定義的巨集,那麼編譯的時候就會顯示錯誤訊息somethi...
define的相關用途
include stdafx.h include using namespace std if 0 1.define 定義數值巨集常量 define pi 3.1415926 2.define 定義字串巨集常量 如相關路徑 define path e work list code a.out 路徑中...
typedef的用法以及與define 的區別
typedef為c語言的關鍵字,作用是為一種資料型別定義乙個新名字。這裡的資料型別包括內部資料型別 int,char等 和自定義的資料型別 struct等 在程式設計中使用typedef目的一般有兩個,乙個是給變數乙個易記且意義明確的新名字,另乙個是簡化一些比較複雜的型別宣告。至於typedef有什...