Prefer C++(三) (轉)
附註::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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Prefer C++ (二) (轉)C++
- prefer 組合 to 繼承繼承
- DircetDraw c/c++ 使用指導(三) (轉)C++
- C++模板的定製三:部分定製C++類 (轉)C++
- C++ Builder 初學問與答(三) (轉)C++UI
- C++程式設計思想筆記之三 (轉)C++程式設計筆記
- C++中的三種繼承public,protected,private(轉)C++繼承
- C++程式碼最佳化方法總結(三) (轉)C++
- ZWeily的小品文(三)C++入門教程(2) (轉)C++
- < < 深度探索C++模型> > 提問(第三章)(上) (轉)C++模型
- < < 深度探索C++模型> > 提問(第三章)(下) (轉)C++模型
- C++ 轉型C++
- The New C++ (轉)C++
- C++ Primer Plus(三)C++
- [C++]類和物件(三)C++物件
- 從C轉入C++ (轉)C++
- 【C++】C++之型別轉換C++型別
- c++經典(轉)C++
- C++簡介 (轉)C++
- c++基礎三(變數)C++變數
- [C++]指標和引用(三)C++指標
- c++學習筆記(三)C++筆記
- C++、C++學習之我見 (轉)C++
- Google C++程式設計風格指南(三):C++ 類GoC++程式設計
- C++物件導向三大特性C++物件
- C++型別轉換C++型別
- C++指標轉換C++指標
- Effective C++: Item 32 (轉)C++
- Effective C++: Item 21 (轉)C++
- Effective C++: Item 24 (轉)C++
- C# 和 C++ (轉)C#C++
- Automation In C++ Builder (轉)C++UI
- 總覽c & c++ (轉)C++
- c++物件的放置 (轉)物件
- 依然熱戀C++ (轉)C++
- C++語言概述 (轉)C++
- C++ STL簡介 (轉)C++
- 讀《Efficient C++》疑惑 (轉)C++