C++结构体部分显式构造导致编译异常分析

今天调试了一段代码如下

#include <iostream>
#include <shared_mutex>#define SECT_NUM	2
#define DI_HIGH_PERM 2
#define DI_READ		1 
#define DI_WRITE	2
#define FMT_BIN    1#define USER_PATH  "d:\\fafiles\\dbtest\\"typedef unsigned long DWORD;
typedef unsigned short WORD;
typedef unsigned char BYTE;typedef struct{WORD  wID;WORD  wLen;WORD  wPerm;WORD  wRW;WORD  wOffset;WORD  wWrOp;WORD  wPnNum;DWORD dwBlockStart;	WORD  wBlockLen;DWORD dwBlockOffset;DWORD dwBlkIndex;BYTE  bBlkIndexNum;BYTE  bBlkIdIndexNum;BYTE  bInnerIndex;
}TItemDesc;//数据项描述typedef struct{char*	   	pszBankName;char*      	pszPathName;char*      	pszBakPathName;TItemDesc* 	pItemDesc;DWORD      	dwItemNum;BYTE*  	   	pbDefault;DWORD  	   	dwDefaultSize;BYTE	   	bVer;WORD	   	wPnNum;bool	   	fUpdTime;WORD		wSaveInterv;std::shared_mutex shared_mtx_BankRW;BYTE*  	   	pbBankData{nullptr};
}TBankCtrl;TItemDesc  g_TCommParaDesc[] =   //标准版
{ //1{0x0001,   10, 		DI_HIGH_PERM,	DI_READ|DI_WRITE,	0, 		0,		FMT_BIN,		1},//Ver{0x8010,	6,		DI_HIGH_PERM,	DI_READ|DI_WRITE,	0, 		0,		FMT_BIN,		4 },//主站IP地址{0x8014,	6,		DI_HIGH_PERM,	DI_READ|DI_WRITE,	0, 		0,		FMT_BIN,		4 },//{0x8015,	16,		DI_HIGH_PERM,	DI_READ|DI_WRITE,	0, 		0,		FMT_BIN,		4 },//APN
};
BYTE g_bDefaultCommPara[] =  //标准版
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //ver//10x5B, 0x07, 94, 240, 13, 10,			//0x8010 10.13.240.94 1883 主站地址+端口0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x8014 6 代理地址+端口'C', 'M', 'N', 'E', 'T', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x8015 16
};TItemDesc  g_TUnitCommParaDesc[] =   //标准版
{//1{ 0x0002,   10,	DI_HIGH_PERM,	DI_READ | DI_WRITE,	0, 		0,	FMT_BIN,		1 },//Ver	{ 0x8900,	1,	DI_HIGH_PERM,	DI_READ | DI_WRITE,	0, 		0,	FMT_BIN,		10 },{ 0x8901,	1,	DI_HIGH_PERM,	DI_READ | DI_WRITE,	0, 		0,	FMT_BIN,		10 },
};BYTE g_bDefaultUnitCommPara[] =  //标准版
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //ver0x00,0x00,
};TBankCtrl g_Bank0Ctrl[SECT_NUM] = {//SECTION0{"sect0 Comm para",USER_PATH"termnComm.cfg",nullptr,									g_TCommParaDesc,sizeof(g_TCommParaDesc)/sizeof(TItemDesc),g_bDefaultCommPara,						sizeof(g_bDefaultCommPara),				0x01,1,false,},//SECTION1{ "sect1 Unit-Comm para",					USER_PATH"UnitCommPara.cfg",				nullptr,									g_TUnitCommParaDesc,					    sizeof(g_TUnitCommParaDesc)/sizeof(TItemDesc),g_bDefaultUnitCommPara,						sizeof(g_bDefaultUnitCommPara),				0x01,1,false,},
};int main()
{std::cout<<"test db !!"<<std::endl;getchar();
}

在VS上编译的时候提示:

1>e:\c++test\dbtest\dbtest1.cpp(109): error C2440: “初始化”: 无法从“initializer list”转换为“TBankCtrl”
1>  e:\c++test\dbtest\dbtest1.cpp(109): note: 无构造函数可以接受源类型,或构造函数重载决策不明确
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========

开始的时候以为是结构体和初始化数组不一致,反复对比无误,最后想到,可能是初始化异常导致,此处的初始化,除了在:TBankCtrl g_Bank0Ctrl[SECT_NUM]初始化,实际在结构体内部也有初始化:

 将该初始化去掉,改为

编译就正常了。

分析:

这是因为在 C++ 中,当一个结构体或类拥有至少一个构造函数时,它的默认构造函数会被自动生成。默认构造函数会尝试初始化所有成员变量,包括指针类型。对于指针类型,默认构造函数会将其初始化为一个未指定的值,通常是 nullptr。

当你将 TBankCtrl 中的最后一个变量从 BYTE* pbBankData{nullptr}; 修改为 BYTE* pbBankData; 时,你就在明示着不需要显式的构造函数,而依赖于编译器生成的默认构造函数,这也就避免了初始化列表中的问题。

结论:

C++使用struct(或者class)的时候,要么选择不默认任何成员,这样类会自动调用默认构造,默认构造会初始化成员变量,如果有部分不默认,那就写一个显示构造接口,或者使用数组批量给实例化(部分成员)对象赋值的时候,确保没有部分对象已经赋值了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/83088.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 之禅

Python 社区的理念都包含在 Tim Peters 撰写的 “Python 之禅” 中 在 Windows 平台的 cmd 命令中打开 python&#xff0c;输入 import this&#xff0c;就能看到 Python 之禅: 翻译&#xff1a; Tim Peters 的 python 之禅Beautiful is better than ugly. # 优美胜于丑陋&am…

鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统em

​ Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目…

chapter13:springboot与任务

Spring Boot与任务视频 1. 异步任务 使用注解 Async 开启一个异步线程任务&#xff0c; 需要在主启动类上添加注解EnableAsync开启异步配置&#xff1b; Service public class AsyncService {Asyncpublic void hello() {try {Thread.sleep(3000);} catch (InterruptedExcept…

vue3 动态导入src/page目录下的所有子文件,并自动注册所有页面组件

main.js添加一下代码&#xff1a; const importAll (modules) > {Object.keys(modules).forEach((key) > {const component key.replace(/src/, /).replace(.vue, );const componentName key.split(/).slice(-2, -1)[0] -page;app.component(componentName, modules…

Asynq: 基于Redis实现的Go生态分布式任务队列和异步处理库

Asynq[1]是一个Go实现的分布式任务队列和异步处理库&#xff0c;基于redis&#xff0c;类似Ruby的sidekiq[2]和Python的celery[3]。Go生态类似的还有machinery[4]和goworker 同时提供一个WebUI asynqmon[5]&#xff0c;可以源码形式安装或使用Docker image, 还可以和Prometheus…

网络基本概念

目录 一、IP地址 1. 概念 2. 格式 3. 特殊IP 二、端口号 1.概念 2. 格式 3.注意事项 三、 协议 1. 概念 2. 作用 四、协议分层 1. 网络设备所在分层 五、封装与分用 六、客户端和服务器 1. 客户端与服务器通信的过程 一、IP地址 1. 概念 IP地址主要用于标识网络主机.其他网络…

如何搭建个人的GPT网页服务

写在前面 在创建个人的 GPT网页之前&#xff0c;我登录了 Git 并尝试了一些开源项目&#xff0c;但是没有找到满足我个性化需求的设计。虽然许多收费的 GPT网页提供了一些免费额度&#xff0c;足够我使用&#xff0c;但是公司的安全策略会屏蔽这些网页。因此&#xff0c;我决定…

机器视觉、图像处理和计算机视觉:概念和区别

机器视觉、图像处理和计算机视觉是相关但有区别的概念。 机器视觉主要应用于工业领域&#xff0c;涉及图像感知、图像处理、控制理论和软硬件的结合&#xff0c;旨在实现高效的运动控制或实时操作。 图像处理是指利用计算机对图像进行复原、校正、增强、统计分析、分类和识别…

Linux 1.2.13 -- IP分片重组源码分析

Linux 1.2.13 -- IP分片重组源码分析 引言为什么需要分片传输层是否存在分段操作IP分片重组源码分析ip_createip_findip_frag_createip_doneip_glueip_freeip_expireip_defragip_rcv 总结 本文源码解析参考: 深入理解TCP/IP协议的实现之ip分片重组 – 基于linux1.2.13 计网理论…

2023好用苹果电脑杀毒软件Cleanmymac X

苹果电脑怎么杀毒&#xff1f;这个问题自从苹果电脑变得越来越普及&#xff0c;苹果电脑的安全性问题也逐渐成为我们关注的焦点。虽然苹果电脑的安全性相对较高&#xff0c;但仍然存在着一些潜在的威胁&#xff0c;比如流氓软件窥探隐私和恶意软件等。那么&#xff0c;苹果电脑…

适配器模式来啦

网上的大多数的资料中适配器模式和代理模式都是紧挨着进行介绍的&#xff0c;为什么呢&#xff1f;&#xff1f;&#xff1f; 是因为适配器模式和代理模式有太多的相似之处&#xff0c;可以进行联动记忆但是也要做好区分。 在菜鸟教程中&#xff0c;适配器模式的定义是作为两…

PyQt学习笔记-Windows系统版本兼容问题踩坑记录

1 Pyinstaller打包的exe在Win10上可以使用&#xff0c;在Win7上缺提示找不到dll。 错误信息&#xff1a; Traceback (most recent call last): File "main.py", line 4, in <module> ImportError: DLL load failed while importing QtWidgets: 找不到指定的…

【大数据】Flink 从入门到实践(一):初步介绍

Flink 从入门到实践&#xff08;一&#xff09;&#xff1a;初步介绍 Apache Flink 是一个框架和分布式处理引擎&#xff0c;用于在 无边界 和 有边界 数据流上进行 有状态 的计算。Flink 能在所有常见集群环境中运行&#xff0c;并能以内存速度和任意规模进行计算。 1.架构 1…

docker中的jenkins之流水线构建

docker中的jenkins之流水线构建项目 1、用node这种方式&#xff08;因为我用pipeline方式一直不执行&#xff0c;不知道为什么&#xff09; 2、创建项目 创建两个参数&#xff0c;一个是宿主端口号&#xff0c;一个是docker中的端口号 3、使用git项目中的Jenkinsfile 4、编写…

区块链学习6-长安链部署:如何创建特定共识节点数和同步节点数的链

正常prepare的时候只支持4 7 13 16个节点个数&#xff0c;想要创建10个节点&#xff0c;其中5个是共识节点&#xff0c;如何实现&#xff1f; 1. 注释掉prepare.sh的这几行&#xff1a; 2. 修改 crytogen的模板文件&#xff1a; 如果是cert模式&#xff1a;chainmaker-crypt…

《使用 VMware 在 Windows 上搭建 Linux 系统的完整指南》

《使用 VMware 在 Windows 上搭建 Linux 系统的完整指南》 1、准备工作1.1 安装 VMware 软件1.2 下载 Linux 发行版镜像文件1.3 安装SSH工具 2、创建新的虚拟机2.1 VMware页面2.2 打开VMware页面并点击创建新的虚拟机&#xff0c;选择自定义2.3 选择系统兼容性&#xff0c;默认…

嵌入式面试刷题(day3)

文章目录 前言一、怎么判断两个float是否相同二、float数据可以移位吗三、数据接收和发送端大小端不一致怎么办四、怎么传输float类型数据1.使用联合进行传输2.使用字节流3.强制类型转换 总结 前言 本篇文章我们继续讲解嵌入式面试刷题&#xff0c;给大家继续分享嵌入式中的面…

compile_and_runtime_not_namespaced_r_class_jar\debug\R.jar: 另一个程序正在使用

问题情况&#xff1a; run App的时候&#xff0c;提示该文件被占用 想要clean Project&#xff0c;还是提示该文件被占用&#xff0c;这个文件和连带的文件夹都无法被删除。 方法1&#xff1a; AndroidStudio下方的terminal&#xff08;没有这个窗口的话&#xff0c;从上面的…

Android Glide MemorySizeCalculator计算值,Kotlin

Android Glide MemorySizeCalculator计算值,Kotlin for (i in 100..1000 step 50) {val calculator MemorySizeCalculator.Builder(this).setMemoryCacheScreens(i.toFloat()).setBitmapPoolScreens(i.toFloat()).setMaxSizeMultiplier(0.8f).setLowMemoryMaxSizeMultiplier(0…

Fastjson 使用指南

文章目录 Fastjson 使用指南0 简要说明为什么要用JSON&#xff1f;用JSON的好处是什么&#xff1f;为什么要用JSON&#xff1f;JSON好处 1 常用数据类型的JSON格式值的范围 2 快速上手2.1 依赖2.2 实体类2.3 测试类 3 常见用法3.1 序列化操作核心操作对象转换为JSON串list转换J…