C++、MFC项目升级到 C++20语言标准问题汇总

1、vs C++ + MFC项目统一升级
升级目标:使用C++20标准  使用最新windowsSDK 使用最新平台工具集(vs2019)

2、无法匹配对应的MFC库
解决方案:vs2019安装中勾选 支持 v142的MFC库 

3、解决“错误 D8016 “/ZI”和“/Gy-”命令行选项不兼容 ”问题
https://blog.csdn.net/LYJ_viviani/article/details/51487877

4、解决 “错误 D8016 “/Gm”和“/std:c++20”命令行选项不兼容”
C/C++ -->代码生成---->"启用最小重新生成" 选择 否

5、bcg库编译
解决方案:  找到 BCGControlBar Pro 28 版本的库,升级到 v142 在做编译

6、函数接口隐式转换检查报错  
使用如下方式:
dynamic_cast :有父子继承关系的强转  
reinterpret_cast : 指针之间的强转
static_cast :基本数据类型强转  static_cast()
const_cast  :强制转换去除 const修饰

7、 双目运算符  ?   : 
条件表达式的result类型要保持一致

8、bcg库 BCGCBProInc.h 中 设置了自动链接bcg库的操作,在编译其他依赖bcg库时要在
预处理器定义中 加入 _BCGCB_DISABLE_AUTOLINK_ 

9、error LNK2026: 模块对于 SAFESEH 映像是不安全的
解决方法:
1.打开该项目的“属性页”对话框。
2.单击“链接器”文件夹。
3.单击“命令行”属性页。
4.将 /SAFESEH:NO 键入“附加选项”框中,然后点击应用。

10、错误  C3848   具有类型“const youth_GeoAlgorithm::setcmp”的表达式会丢失一些 const-volatile 限定符以调用“bool youth_GeoAlgorithm::setcmp::operator ()(const GIS_DoublePoint &,const GIS_DoublePoint &)”
解决方法: 在仿函数setcmp::operator ()(const GIS_DoublePoint &,const GIS_DoublePoint &) 后面加入const 修饰

11、 error C2039: “DOMDocument”: 不是“MSXML2”的成员
解决方法: 
CreateInstance(__uuidof(MSXML2::DOMDocument),NULL ,CLSCTX_INPROC);
改为
CreateInstance(__uuidof(MSXML2::DOMDocument60 ),NULL ,CLSCTX_INPROC);

12、严重性 代码  说明  项目  文件  行   禁止显示状态
错误  C2664   “std::pair std::make_pair(_Ty1 &&,_Ty2 &&) noexcept()”: 无法将参数 1 从“CGisVetex *”转换为“_Ty1 &&”  ToolCabinet E:\jinhua_diaodu_Proj\DLL_PROJECT\ToolCabinet\DijkstraAlgorithm.cpp 121 
解决方案:                    
m_Paths.insert(make_pair(reinterpret_cast(pVetex),reinterpret_cast(pNewPath)));

13、c4596成员中的非法限定名
解决方案: 
举例:CDevExtProp& CDevExtProp::operator = (const CDevExtProp &Temp);
定义的成员函数已经在类里了,所以不需要再次声明作用域,把CDevExtProp::去掉即可。

14、严重性  代码  说明  项目  文件  行   禁止显示状态
错误  C2679   二元“=”: 没有找到接受“CIndMachine”类型的右操作数的运算符(或没有可接受的转换)    ModelCore   E:\jinhua_diaodu_Proj\DLL_PROJECT\ModelCore\IndMachine.cpp  99  
解决方案: 申明和函数返回类型一样的变量做赋值,然后在转换成*this


15、严重性 代码  说明  项目  文件  行   禁止显示状态
错误  C2664   “INT_PTR CArray::Add(ARG_TYPE)”: 无法将参数 1 从“CModelShape::CPoint_tpe”转换为“ARG_TYPE”  ModelCore   E:\jinhua_diaodu_Proj\DLL_PROJECT\ModelCore\Shunt.cpp   77  
解决方案: 构造临时变量赋值,在传入Add函数中

16、严重性  代码  说明  项目  文件  行   禁止显示状态
错误  C2653   “MSXML2”: 不是类或命名空间名称    ManagePowerGridLevel    E:\jinhua_diaodu_Proj\DLL_PROJECT\cimsvgImport\ManagePowerGridLevel\code\CommonFuncs.h  25  
解决方案:
#ifndef _MSXML14_
#define _MSXML14_
#import
using namespace MSXML2;
#endif

17、严重性 代码  说明  项目  文件  行   禁止显示状态
错误  C2783   “void std::swap(_Ty &,_Ty &) noexcept()”: 未能为“_Enabled”推导 模板 参数   AutoRouting C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\utility 81  


18、error LNK2019: 无法解析的外部符号 __vsnwprintf,该符号在函数 "long __stdcall StringVPrintfWorkerW...
答案就是链接:legacy_stdio_definitions.lib  这个lib即可

你可能感兴趣的:(c++,mfc,开发语言)