C 靈活使用C C 巨集定義

2021-07-12 06:03:55 字數 2076 閱讀 4461

靈活使用c/c++巨集定義

#define巨集定義在c語言中有廣泛使用。對於c++語言,《effective c++》第二章告訴我們,在c++中盡量用const、enum、inline替換#define,可以避免很多陷阱。其中const用於定義常量,enum用於定義列舉,inline用於定義內聯函式。

儘管《effective c++》第二章指出#define巨集定義的諸多陷阱,這不代表作者不希望我們使用#define。#define的作用是,在預編譯階段,編譯器將#define定義的**段替換到使用相應巨集定義的位置上去,相當於直接將**替換巨集,如果巨集定義是安全的、簡單的,那麼#define巨集定義會有很大的作用。很多著名c++第三方庫使用了大量的巨集定義,可以說明這一點。

來看看eigen矩陣庫。eigen是基於模板的c++開源矩陣庫,使用或者支援eigen的知名專案有google的tensorflow、point cloud library、opencv等。eigen運用了大量的模板,為了管理這些模板,eigen使用了大量的巨集,我摘要一段如下,其中##符號表示連線兩個字串:

#define eigen_make_typedefs(type, typesuffix, size, sizesuffix)   \

typedef matrixmatrix##sizesuffix##typesuffix; \

...#define eigen_make_typedefs_all_sizes(type, typesuffix) \

eigen_make_typedefs(type, typesuffix, 2, 2) \

eigen_make_typedefs(type, typesuffix, 3, 3) \

...eigen_make_typedefs_all_sizes(int, i)

eigen_make_typedefs_all_sizes(float, f)

...

上述寫出的巨集定義**,定義了

matrix2i<->matrix2, 2>;

matrix2f<->matrix2, 2>;

matrix3i<->matrix3, 3>;

matrix3f<->matrix3, 3>

//巨集定義

#define vtksetmacro(name,type) \

virtual

void set##name (type _arg) \\}

#define vtkgetmacro(name,type) \

virtual type get##name ()

//定義set/get函式

vtksetmacro(currentcursor,int);

vtkgetmacro(currentcursor,int);

上述**很方便地定義了

virtual void setcurrentcursor(int _arg);

virtual int getcurrentcursor();

這就免得我再去手寫一大堆**。可見巨集定義用於定義是很方便的。

另外我附上如果根據作業系統巨集來定義不同資料的示例**:

#ifdef _win32

#define smartpointer(type) std::tr1::shared_ptrsp;

#else

#define smartpointer(type) std::shared_ptrsp;

#endif

//下面的**編譯錯誤

//#define smartpointer(type) \

//#ifdef _win32 #define std::tr1::shared_ptrspa; \

//#else #define std::shared_ptrspa; #endif

這裡看出,如果#define內部還有複雜的巨集命令,則編譯器很難給出正確的編譯結果。尤其是使用舊版本編譯器,必須要注意巨集定義不能過於複雜。

ios 靈活使用巨集

繼承於c語言和c 中的巨集定義,oc中也可以方便有效的支援巨集定義使用,簡單的巨集定義誰都知道,比如定義乙個int型常量,string型別的字串都可以。如果複雜一些呢,比如用巨集定義實現單例,實現類的歸檔操作,其實都是可以的。就以類的歸檔操作為例,說明一下 現有巨集定義 sscodingimplem...

C C 巨集定義的常見使用

在我們平時的開發工程中,會經常使用到巨集,它功能強大,用的好會帶來意想不到的妙用。今天來整理下一些常見的用法,方便回顧。將其後面的巨集引數進行字串化操作 stringfication 注意 a 忽略傳入引數名前面和後面的空格。b 當傳入引數名間存在空格時,編譯器將會自動連線各個子字串,用每個子字串之...

C C 預定義巨集

下面描述的巨集定義,不需引用其他標頭檔案,直接可用於 中。特定的作用給我們提供了不少的便利。分別描述如下 1 file line function 或者 func file 當前程式行所在原始檔名稱,標準c支援,該巨集當做字串對待 line 當前程式行所在原始檔內的行號,標準c支援,該巨集當做整形對...