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打开不生效。

麻烦专家看下,谢谢。

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

你定义的宏只在编译DLL时起作用,之后修改宏定义,不会影响之前已经编译的DLL。

  1. 你可以在头文件使用内联函数,内联函数内根据宏定义选择编译
    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;      //返回结果
    }
    
  2. 或者在DLL库里实现两个版本函数,然后再头文件里根据宏定义来选择相应的函数
    // 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宏定义