GitHub C/C++項目新奇寫法

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++時的兩種特殊情形:

  1.  C調用C++重載函數,如 add(int,int) , add(float,float),應該分別定義以達到區分目的:add_int(int,int) add_float(float,float)
  2. C調用C++類函數: 應寫一個函數,函數裏調用C++類函數

4.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章