VS2019编译器错误/警告码查询方法及C++代码编译报错问题求解
VS2019编译器错误/警告查询方法及代码问题修复方案
错误和警告码查询方法
你遇到的G开头的随机编码是VS为交叉编译错误生成的本地临时标识,无实际参考价值,直接看后方的错误描述即可。
如果是MSVC原生编译器的错误,直接在VS错误列表中右键对应错误,选择「显示错误帮助」,或选中错误码按下F1即可调出官方说明文档。你当前的告警里带[-Wwrite-strings]标识,说明用的是GCC类编译器,错误描述本身已经给出了问题根源,直接按描述排查即可。
现有问题修复方案
警告 ISO C++ forbids converting a string constant to 'char*' 修复
问题根源:C中字符串常量为const char*只读类型,你结构体中定义的成员为可修改的char*类型,赋值时类型不匹配,不符合C标准。
修复方法:将结构体中所有char*改为const char*即可,修改后的结构体代码如下:
typedef struct { const char* outputpinno[16]; const char* outputname[16]; const char* inputpinno[16]; const char* inputname[16]; const char* Analogpinno[8]; const char* Analogname[8]; const char* CanName[8]; } pme_T;
错误 'Pme' does not name a type 及数组初始化问题修复
问题根源:
- 你写的
Pme[0].outputpinno[16] = {...}写法错误:C++不支持在数组定义完成后,用大括号批量给数组成员赋值;且outputpinno[16]是访问数组的第17个元素(下标从0开始),本身已经越界,不代表整个数组。 - 「Pme不命名类型」报错是因为你将赋值代码写在了全局作用域,全局作用域仅支持变量定义,不支持执行赋值语句,编译器会把赋值代码识别为新的变量定义,因此报找不到Pme类型的错误。
修复方法:二选一即可
方案1:定义变量时直接初始化
pme_T Pme[2] = { // 初始化第一个pme_T元素 { // 对应outputpinno数组成员 {"J1-12", "J1-1", "J2-12", "J2-1", "J3-12", "J3-1", "J4-12", "J4-1", "J1-7", "J1-6", "J2-7", "J2-6", "J3-7", "J3-6", "J4-7", "J4-6"}, // 剩余outputname、inputpinno等成员按顺序补充初始化值,无值可留空或填NULL {}, {}, {}, {}, {}, {} }, // 初始化第二个pme_T元素,按需填充值 {} };
方案2:在函数内部逐个赋值
// 函数内部实现赋值 const char* pinno_temp[16] = {"J1-12", "J1-1", "J2-12", "J2-1", "J3-12", "J3-1", "J4-12", "J4-1", "J1-7", "J1-6", "J2-7", "J2-6", "J3-7", "J3-6", "J4-7", "J4-6"}; for (int i = 0; i < 16; i++) { Pme[0].outputpinno[i] = pinno_temp[i]; }
内容的提问来源于stack exchange,提问作者Colin McDonough
相关产品推荐
相关产品推荐

