Prefer C++(三) (轉)

amyz發表於2007-08-14
Prefer C++(三) (轉)[@more@]

附註::namespace prefix = o ns = "urn:schemas--com::office" />

1、 用C++編寫DLL時的一些注意事項(.c和.cpp聯編時注意事項與此同)

一般來講首先要在宣告匯出的頭中使用extern “C”{},以確保函式名稱的匹配。對於驅動中的匯出函式大多由操作定義,這一步由OS負責。以2000下列印中的EnumPrintProcessorDatatypesW為例進行說明:

該函式在winspool.h 中的宣告為:

BOOL

WIN

EnumPrintProcessorDatatypesW(

    IN LPWSTR  pName,

    IN LPWSTR  pPrintProcessorName,

    IN D  Level,

    OUT LPBYTE  pDatatypes,

    IN DWORD  cbBuf,

    OUT LPDWORD pcbNeeded,

    OUT LPDWORD pcReturned

); 

而在winspool.h的開始處有:

#ifdef __cplusplus

extern "C" {

#endif

結尾處有:

#ifdef __cplusplus

}

#endif

也就是說:對於EnumPrintProcessorDatatypesW進行編譯和聯接時按照C規範,參考指定的規則來生成檔名,而忽略副檔名是.c還是.cpp。對於上述函式因為採用WINAPI(stdcall)呼叫規則,對於msvc++,目標檔案中生成的函式名為_EnumPrintProcessorDatatypesW@28。如果沒有extern “C”,則對於C++檔案,按照C++規範進行名字解析,結果可能是? EnumPrintProcessorDatatypesW@@YGHPAU_PRINTPROCESSOR@@K@Z(不一定真是這個名字,舉例而已)。所以說要想在c和c++中通用某些函式,一定要用extern “C”。

由於函式命名規範,各種之間並不一樣。為了能在各種編譯器間共用dll,就必須使用.def檔案。.def 檔案相當於給編譯後的函式名又加了一個別名,但實際上兩者仍是指向同一個東西(很象c++裡的引用)。比如對2000的列印處理器的.def檔案中有:

EXPORTS

  EnumPrintProcessorDatatypesW

  --------

這樣列印處理器實際上就是以EnumPrintProcessorDatatypesW來匯出這個函式的。至於匯入時,msvc++怎麼從截斷後的EnumPrintProcessorDatatypesW對應到完整的_EnumPrintProcessorDatatypesW@28,我沒找到相關資料。但Jeffrey Richter在Programming Application for 中說“Microsoft的聯接進行了正確的操作。”

對於msvc++,這條規則對於C++程式也是成立的,即ms的聯結器可以完成從類似EnumPrintProcessorDatatypesW這樣的輸出名到那一大砣C++名字的對映。這意味著什麼呢?下面的結論屬於某些場合可以用,但不大應該用的東西。如果只用ms的東西,可以在

dll中的實現函式,在應用中包含相關的標頭檔案,在.def中指明函式名。什麼都不用加(包括extern “C”,__declspec,dllimport,dllexport---)。

  就象下面這樣:

testdll.cpp  ----àtestdll.exe應用程式

 

#include

#include

 

using std::cout;

 

int WINAPI add(int i,int j);

 

int main(int argc, char* argv[])

{

  int i=add(6,7);

  cout<

  return 0;

}

 

mathadd.cpp  -------àmathadddll dll程式

 

#include

int WINAPI add(int i,int j)

{

  return i+j;

}

 

mathadd.def

 

LIBRARY MATHADD

 

EXPORTS

  Add

 

這將執行的非常好。

 

關於__declspec(dllexport) : 如果不用.def的時候,用此關鍵字指明輸出函式及變數。

關於__declspec(dllimport) : 便於編譯器進行,可不使用。

 

2、Prefer C++的 6個部分:

1、型別系統

2、資源管理

3、出錯處理

4、細說inline

5、模板及標準庫◎

6、執行時多型

7、結構化,OO、GP

所有這些是我讀來的,自己準備用到程式中的,也有些是。

希望C++的到更廣泛的應用。

3.關於在vc++釋出版本得技巧

首先要明確得是,只要有各種符號資訊,釋出版本是可除錯得。想想Windows所帶得Symbols就知道了。

操作步驟如下:

1.project setting->c/c++->de info(組合框) 此處選Program Database

2. project setting->link 上選中Generate Debug Info

3. project setting->link 上Category 選debug 而後選中Generate mapfile和

Debug Info 和Microsoft format.

ps:

單就語言而論,我認為C++比C好,因為很多改進都是無數絕代高手根據現實中出現的問題,而匯入的。也比其他各種語言強大,因為各種語言特性都是因為需要才被加入的。也正因此,所以他才複雜。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-956678/,如需轉載,請註明出處,否則將追究法律責任。

相關文章