本人创建了三个工程:
CCAPI-用来验证函数
CCDLL-用来生成DLL
CCTEST-用来调用生成的DLL
第一步:
在CCAPI中添加APIDefine.h和APIDefine.cpp,代码如下:
APIDefine.h中的内容:
#define DATA_SUM //定义宏开关
#define DATA_DIF //定义宏开关
const int num_1 = 9; //定义num_1
const int num_2 = 8; //定义num_2
_declspec(dllexport) int data_calculate(int num_1, int num_2); //定义函数data_calculate
APIDefine.cpp中的内容:
#include "pch.h"
#include "APIDefine.h"
_declspec(dllexport) int data_calculate(int num_1, int num_2)
{
int num_3 = 0; //定义变量
#ifdef DATA_SUM //宏判断
num_3 = num_1 + num_2; //DATA_SUM打开时执行代码
#endif
#ifdef DATA_DIF //宏判断
num_3 = num_1 - num_2; //DATA_DIF打开时执行代码
#endif
return num_3; //返回结果
}
调用函数int data_calculate(int num_1, int num_2)后查看返回结果如下:
当
#define DATA_SUM
//#define DATA_DIF
返回值为 17;
当
//#define DATA_SUM
#define DATA_DIF
返回值为 1;
以上验证结果和期望结果是一样的。
第二步:
将测试好的APIDefine.h和APIDefine.cpp(代码如上)添加值CCDLL工程,并生成RELEASE的DLL和LIB。
第三步:
建立CCTEST工程,把第二步生成的LIB和DLL还有APIDefine.h拷贝到工程目录,添加APIDefine.h和LIB,修改APIDefine.h为dllimport如下:
#define DATA_SUM //定义宏开关
#define DATA_DIF //定义宏开关
const int num_1 = 9; //定义num_1
const int num_2 = 8; //定义num_2
_declspec(dllimport) int data_calculate(int num_1, int num_2);
在CCTEST里调用调用函数int data_calculate(int num_1, int num_2)后查看返回结果如下:
当
#define DATA_SUM
//#define DATA_DIF
返回值为 1;(这不是期望的值17)
当
//#define DATA_SUM
#define DATA_DIF
返回值为 1;
问题出现:宏开关#define DATA_SUM打开时应该是求8+9结果是17,但结果是1。 宏开关#define DATA_SUM打开不生效。
麻烦专家看下,谢谢。
有两个问题,建议一下:
1、最好不要用宏定义来实现函数不同的行为,特别是你这个场景中还需要两个宏定义同时打开,最好封装成两个方法或者再添加一个参数代表要做什么类型的计算;
2、宏定义是在dll编译过程中生效的,不是在你引用dll时候靠包含头文件来生效的,这点理解了你就不会希望通过修改宏来得到不同的运算结果;
有帮助请采纳,谢谢!
你定义的宏只在编译DLL时起作用,之后修改宏定义,不会影响之前已经编译的DLL。
inline int data_calculate(int num_1, int num_2)
{
int num_3 = 0; //定义变量
#ifdef DATA_SUM //宏判断
num_3 = num_1 + num_2; //DATA_SUM打开时执行代码
#endif
#ifdef DATA_DIF //宏判断
num_3 = num_1 - num_2; //DATA_DIF打开时执行代码
#endif
return num_3; //返回结果
}
// APIDefine.h
const int num_1 = 9; //定义num_1
const int num_2 = 8; //定义num_2
_declspec(dllexport) int data_calculate_sum(int num_1, int num_2);
_declspec(dllexport) int data_calculate_dif(int num_1, int num_2);
#ifdef DATA_SUM
#define data_calculate(x, y) data_calculate_sum(x, y)
#else
#define data_calculate(x, y) data_calculate_dif(x, y)
#endif
// APIDefine.cpp
_declspec(dllexport) int data_calculate_sum(int num_1, int num_2)
{
return num_1 + num_2; //DATA_SUM打开时执行代码
}
_declspec(dllexport) int data_calculate_dif(int num_1, int num_2)
{
return num_1 - num_2;
}
可能是生成的ddl进行缓存造成的
能不能加个参数
编译生成dll时,APIDefine.h中不要包含 DATA_SUM DATA_DIF宏定义