用c编写的dll文件中的函数和从cpp文件调用的函数的预期行为

时间:2018-02-28 12:47:37

标签: c++ c

我在c中写了一个dll文件并从cpp调用它但是我没有得到预期的行为请解释我是如何工作的 我的dll文件(.c和.h)

#include <stdio.h>
#if defined (WIN32)
#if defined(FUNCTIONS_STATIC)
#define FUNCTIONS_API
#else
#if defined(FUNCTIONS_EXPORTS)
#define FUNCTIONS_API __declspec(dllexport)
#else
#define FUNCTIONS_API __declspec(dllimport)
#endif
#endif
#else
#define FUNCTIONS_API
#endif
#ifdef __cplusplus
extern "C" {
#endif
#ifdef MYMATHDLL_EXPORTS
#define MYMATHDLL_API __declspec(dllexport) 
#else
#define MYMATHDLL_API __declspec(dllimport) 
#endif
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>

#define PI 3.1415
MYMATHDLL_API double PowerOf3(double UserNumber);
#ifdef __cplusplus
}
#endif

.c

#ifdef __cplusplus
double PowerOf3(double UserNumber)
{
    return UserNumber * UserNumber;
}
#endif
#ifndef __cplusplus
    double PowerOf3(double UserNumber)
    {
        return UserNumber ;
    }

#endif

我将上面的函数编译为dll并在cpp文件中使用它

.cpp文件

#include <iostream>
#include <fstream>    
#include <cmath>
#include <windows.h> 
#include <stdio.h>
#include <fstream>
#include "modell.h"
#include "modellfunktionen.h"
#ifdef __cplusplus
extern "C"
{
#include "MyMathDll.h"
}
#endif   
using namespace std;
typedef double(*MYFUN2)( double op);
int main(int argc, char** argv) {
   widepath ="C:\\Personal\\VB_practice\\MyMathDll\\x64\\Debug\\MyMathDll.dll";
    hMod = LoadLibraryA(widepath);
    //cout << widepath << endl;
    MYFUN2  pfun2 = (MYFUN2)GetProcAddress(hMod, "PowerOf3");
    cout << pfun2(10) << endl;
}

给我结果10,但我认为它是100,因为定义了cplusplus。我在哪里弄错了。

1 个答案:

答案 0 :(得分:1)

它不起作用,因为那些定义在编译时被检查,你把它编译为C代码,所以编译器检测到你没有使用C ++所以

.as-console-wrapper { max-height: 100% !important; top: 0; }

触发,非匹配的preprocesor指令在编译时对于编译器是“不可见的”,就像你从代码中手动删除它们一样,它们不像运行时那样工作