我在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。我在哪里弄错了。
答案 0 :(得分:1)
它不起作用,因为那些定义在编译时被检查,你把它编译为C代码,所以编译器检测到你没有使用C ++所以
.as-console-wrapper { max-height: 100% !important; top: 0; }
触发,非匹配的preprocesor指令在编译时对于编译器是“不可见的”,就像你从代码中手动删除它们一样,它们不像运行时那样工作