VC++動態鏈接庫(DLL)編程深入淺出:Q&A(原創)


Q1:extern “C” 是做什么用的?

A1:一種情況是多個文件中,變量聲明或者函數聲明,需要extern “C”,這種情況在這里不做討論。
  在dll工程中,被extern "C"修飾的變量和 函數是按照C語言方式編譯和連接的,即把C++的函數用C這個方言表述出來,已達到C能看懂的目的。

Q2:C語言調用C++的dll,應該注意什么?

A2:  如extern“C”里面說的那樣,如果C++編寫的函數放在dll里面,不被extern“C”修飾的話,被C調用時,則C不認識,所以在C++工程里面聲明時,要加extern“C”修飾,就像:

extern "C" __declspec(dllexport)   void IMVL_LoadModel(const char* model_filename, svm_model* model); 
extern "C" __declspec(dllexport)   void IMVL_Train(const char* data_filename, svm_model* model); 
extern "C" __declspec(dllexport)   void IMVL_Predict(svm_model* model, const double* problem, int DimNum, double* level); 

 

  但是在調用時,則不需要extern“C”來修飾,參看下面網友的回復:

 

為了使c能調用c++寫的dll。c++中使用extern "C"{ }修飾該接口即可
這個原因你應該知道吧。大概意思是告訴c++編譯器這段代碼用c編譯器編譯。編譯之后的結果是c方式的而不是c++方式的。
但是c中不識別extern "C"。
綜上兩點,在dll頭文件中常這樣寫,如下:
意思就是編譯的時候編譯成c方式。但是包含頭文件時,因為是c調用所以會忽略掉extern "C"
#ifdef __cplusplus
 extern "C"
 {
 #endif

...

#ifdef __cplusplus
 }
 #endif

 

Q3:C++調用C工程的dll,應該注意什么?

A3:暫時沒什么好注意的。

 

Q4:

A4:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM