1. 對象的特殊初始化:逗號表達式,結果返回逗號表達式中最後一項。
#define MKSTATUS(ret, codev) ( ret.code=codev, ret.sourcefile=__FILE__, ret.sourcelineno=__LINE__, ret )
2. 枚舉類型,用作常量 (C++11中可採用匿名namespace的方式定義)
typedef enum StatusCode_t
{
ERROR=-1,
SUCCESS=0
} StatusCode;
typedef struct Status_t
{
StatusCode code; /* <0 = error, >=0 success */
const char *sourcefile;
int sourcelineno;
TCHAR msg[65];
} Status;
3. C++ 調用 C
由於C++編譯器需要支持函數的重載,會改變函數的名稱,因此dll的導出函數通常是標準C定義的。這就使得C和C++的互相調用變得很常見。但是有時可能又會直接用C來調用,不想重新寫代碼,讓標準C編寫的dll函數定義在C和C++編譯器下都能編譯通過,通常會使用以下的格式:(這個格式在很多成熟的代碼中很常見)
#if defined(__cplusplus)//只有c++編譯器纔有這個宏定義。
extern "C" {
#endif
// 在這裏寫標準C程序,例如dll導出函數的定義//以下結尾必不可少
#ifdef __cplusplus
}
#endif下面解釋一下上面的代碼:
首先__cplusplus是C++編譯器內部定義的宏,如果使用的C編譯器,__cplusplus宏不會被定義。它可以作爲區分使用的是C編譯器還是C++編譯器的標誌。在標準C中C代碼直接寫就可以了。而在C++中,需要加extern "C"或包含在extern "C"塊中。
重要參考: C/C++互相調用具體例子
延伸: C調用C++時的兩種特殊情形:
- C調用C++重載函數,如 add(int,int) , add(float,float),應該分別定義以達到區分目的:add_int(int,int) add_float(float,float)
- C調用C++類函數: 應寫一個函數,函數裏調用C++類函數
4.