CC201904 2021-12-21 23:38 采纳率: 75%
浏览 109
已结题

VS2019生成MFC DLL后,再调用时.h文件中的宏开关不起作用,如何解决?(开发工具-visual studio)

本人创建了三个工程:
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打开不生效。

麻烦专家看下,谢谢。

  • 写回答

5条回答 默认 最新

  • 急速光粒 2021-12-22 08:52
    关注

    有两个问题,建议一下:
    1、最好不要用宏定义来实现函数不同的行为,特别是你这个场景中还需要两个宏定义同时打开,最好封装成两个方法或者再添加一个参数代表要做什么类型的计算;
    2、宏定义是在dll编译过程中生效的,不是在你引用dll时候靠包含头文件来生效的,这点理解了你就不会希望通过修改宏来得到不同的运算结果;
    有帮助请采纳,谢谢!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 12月30日
  • 已采纳回答 12月22日
  • 创建了问题 12月21日

悬赏问题

  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果