靈活使用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支援,該巨集當做整形對...