遇到的C++代码警告及错误

一. 警告

1. warning C4018: “<”: 有符号/无符号不匹配

在这里插入图片描述
原因: 在for循环中默认vecScanData.size()时unsigned int类型,而 i常常写成int类型,改成size_t(计算数组大小或索引)就行。

2. warning C4005: "XXX"宏重定义

在这里插入图片描述
解决: 宏定义要在 #include<windows.h> 之前;也有可能配置项里已经定义过了无需再定义。

3. warning C4244:"=": 从"double"转到"int"可能丢失数据。

在这里插入图片描述
编译器例行警告。如果对精度没太大要求,不用理会。c++是截断的,无四舍五入。

4. 在这里插入图片描述

顾名思义,vs项目属性配置里输出文件路径没有以\结尾,编译器自动帮你加了,所以加“\”就可以。

5. “表达式必须是可修改的左值”。

当你试图给一个表达式赋值时会有此提示。即=赋值号左侧的只能是变量。

二.错误

1. fatal error C1189: #error: “No Target Architecture”

在这里插入图片描述
原因:头文件重复包含,既有windows.h,又有前者已经包含的系统文件出现。
解决:①删除被包含的系统文件,只留下windows.h
②调换顺序,使得windows.h文件在上方,确保其先执行。

2. error C2011: “sockaddr”:“struct”类型重定义

在这里插入图片描述
原因:

>  windows.h和winsock2.h存在有类型重定义,往往体现在VC程序中包含winsock2.h时出现编译错误:

解决:在VS项目属性->C/C++预处理器定义中添加如下代码:
WIN32_LEAN_AND_MEAN

3. error C2059: 语法错误:“常数”

原因:不小心使用了系统关键字。
解决:养成好的习惯,永远把系统文件放在最前面,如Windows.h。

4. error C3805: “常数”: 意外标记,应输入“}”或者“,”

看到一位博主有写3、4两个错误同时出现,我也是这样,然后给出的解决办法是:在项目配置属性->常规->字符集选择 未设置。确实解决了。

5. error C3646: “serveraddr”: 未知重写说明符;

error C4430: 缺少类型说明符 - 假定为 int。

可能有3种原因:
①循环引用
即我中有你,你中有我,虽然咱俩关系好,但也不能到这种地步吧。
②语法错误
符号如;英文写成了中文,你不倒霉谁倒霉。
③类的顺序错误
如果一个类的成员中包含另一个类,则被包含的类的生命一定要在包含的类之前。你想想小弟是不是永远冲锋在前 。

6. error C2672: “std::invoke”: 未找到匹配的重载函数;

error C2893: 未能使函数模板“unknown-type std::invoke(_Callable &&,_Types &&…) noexcept()”专用化
在这里插入图片描述

原因:thread定义线程实参和形参数据类型不同,导致出现重载错误。即参数给错了。这里调用的函数存在参数,而线程里没有给出。
解决办法:把参数给人家。

7. error C2664: “DWORD GetModuleFileNameW(HMODULE,LPWSTR,DWORD)”: 无法将参数 2 从“char [255]”转换为“LPWSTR”

字符集的问题,改为多字节字符集就可以。

8. error LNK2001: 无法解析的外部符号

多为链接的库没有或不对。

9.MSVCRTD.lib(exe_main.obj) : error LNK2001: 无法解析的外部符号 _main

转载这里
确定是那种程序还要有对应的main入口函数实现才行。

补充:本质是缺main函数,但如果你定义了一个main类来作为另一个项目的主类编译时也报这个错误,那么你需要检查一下另一个项目的属性——>配置类型必须是lib/dll库类型,而不是.exe类型(很容易忘记修改)。

10. error LNK2001: 无法解析的外部符号 “private: static class CData * CData::m_pCData” (?m_pCData@CData@@0PAV1@A)

类似问题首先检查static变量有没有在cpp文件类外初始化。
在这里插入图片描述
注意初始化格式要正确。

11. error C2760: 语法错误: 意外的令牌“标识符”,预期的令牌为“;”

打开项目属性页,将语言——>符合模式修改为 否。

在这里插入图片描述

12. error LNK2005: "XXX"已在*.obj中定义

经检查,是由于①自己在一个全局定义头文件中定义了一个全局变量:
string a = xxx;
②而且自己在多处引用了这个全局头文件,造成了变量重定义的错误。

解决办法:

将该变量定义为const常量即可;

插一个网上别人遇到的类似情况:
是由于同样全局定义了变量,是在一个类的头文件引用该变量,然后该类的.cpp文件又包含了该类头文件,所以造成了重复定义。

这种情况解决办法:删除头文件中引用该变量的语句,在.cpp文件中引用即可

13. Debug Error! - abort() has been called!

调试时出现此弹窗报错,点中止(vs下),会定位到出现问题的地方。导致出现此错误的原因大致有以下几点:
① 非法指针访问和内存泄漏
② 指针访问内存越界出现问题
③ 不支持中文
④ 内存不够分配
⑤ 可能有多线程访问资源导致的问题
⑥ 代码库等版本不同可能导致

大多数原因还是指针和内存问题,好好检查代码:
第一:检查存储容器申请的空间有没有释放,下标访问是否越界
第二:检查堆栈空间是否已经被全部分配满,建议每次分配内存不要太大,记得释放。
第三:指针指向了不可预期的内存位置,即非法访问。

14. vector越界问题:Expression: vector subscript out of range

这个下标越界几乎是我遇到最多次的问题了。。。大多数情况下,出错是因为代码的逻辑有问题。比如

①vector的size为0,而你还要使用下标去访问它
②在for循环下,使用循环变量(如 i )作为下标访问vector元素时,要注意 i 是不是连续的,不连续的访问也会越界出错
③最近遇到的隐蔽越界。当vector的size=0时,size() - 1这样的操作是危险的,因为 (假设为a) a.size()本身是无符号整数,那相应的 a.size() - 1也是无符号整数,此时若忽略了这点仍然作为下标访问就会出错。,所以尽量避免使用/或者在前面加int强转一下。
④ 使用某些外来变量作为vector下标时,一定要注意它的范围!
⑤ 类似的,如果你还没有为vector分配足够的空间就去访问,自然越界异常
总之,好好检查代码逻辑。

15. function uses ‘auto’ type specifier without trailing return type

我翻译为: 你定义的函数使用了auto类型声明,却没有尾随返回类型。
解决办法:

确认你的返回值实际是什么类型,在函数声明时就把auto设为什么类型。
比如想要返回多个返回值,使用元组存返回值,就在声明函数类型时声明为auto<int, int, int>类似这种。

这个我遇到是在linux下编译时,windows下不存在此情况。

16. CRT detected …after end of heap buffer

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值