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:
1. 任何单位或个人认为本博的内容可能涉嫌侵犯其合法权益,可以及时的联系我(olenet#126#com),我会立即更正或删除。
2. 欢迎转载,记得贴链接^_^。www.cnblogs.com/OleNet