C 慎用define,以及相關的替代的方法

2021-07-03 21:05:46 字數 1184 閱讀 3914

在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有什...