zoukankan      html  css  js  c++  java
  • 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:

  • 相关阅读:
    UVA138 Street Numbers(数论)
    UVA11388 GCD LCM(数论)
    POJ1088 滑雪(记忆化搜索)
    POJ1003 Hangover
    POJ1836 Alignment(LIS)
    POJ1062 昂贵的聘礼(最短路)
    POJ3083 Children of the Candy Corn(搜索)
    POJ1068 Parencodings(模拟)
    POJ1573 Robot Motion(模拟)
    POJ2632 Crashing Robots(模拟)
  • 原文地址:https://www.cnblogs.com/OleNet/p/3171252.html
Copyright © 2011-2022 走看看