开发必看!C++常见错误合集和解决方法

1、临时变量的非const引用

编译报错:Line
11: Char 34: error: cannot bind non-const lvalue reference of type
‘std::__cxx11::string&’ {aka ‘std::__cxx11::basic_string<char>&’}
to an rvalue of type ‘std::__cxx11::basic_string<char>’

这个错误是C++编译器的一个关于语义的限制。

如果一个参数是以非const引用传入,c++编译器就有理由认为程序员会在函数中修改这个值,并且这个被修改的引用在函数返回后要发挥作用。但如果你把一个临时变量当作非const引用参数传进来,由于临时变量的特殊性,程序员并不能操作临时变量,而且临时变量随时可能被释放掉,所以,一般说来,修改一个临时变量是毫无意义的,据此,c++编译器加入了临时变量不能作为非const引用的这个语义限制。

2、error: cannot call member function
without object

解决方法:找到.h文件,在方法前加上static修饰

3、g++编译报错原因分析expected
type-specifier before

原因:因为没有引入相应的头文件,加入相应的.h可以解决

4、warning: ‘’ [-Wreorder]

产生这种问题是类成员初始化顺序不对,调整顺序即可;

5、error C2006:  #include expected a filename, found ‘identifier’

中文对照:#include命令中需要文件名

分析:一般是头文件未用一对双引号或尖括号括起来,例如“#include stdio.h”

6、error  C2010:’character’  : unexpected in macro formal parameter list

中文对照:带参宏的参数表表现未知字符

分析:例如“#define  s(r|) r*r”中参数多了一个字符‘|’ 

7、error  C2014: 
preprocessor command must start as first nonwhite space

中文对照:预处理命令前面只允许空格

分析:每一条预处理命令都应独占一行,不应出现其他非空格字符 

8、error  C2064: 
term does not evaluate to a function

中文对照:无法识别函数语言 

分析:1、函数参数有误,表达式可能不正确,例如“sqrt(s(s-a)(s-b)(s-c));”中表达式不正确 

2、变量与函数重名或该标识符不是函数,例如“int i,j; j=i();”中i不是函数  

9、error C2110:  cannot add two pointers

中文对照:两个指针量不能相加 

分析:例如“int
*pa,*pb,*a; a = pa + pb;”中两个指针变量不能进行“+”运算 

10、error  C2117: 
‘xxx’ : array bounds overflow

中文对照:数组xxx边界溢出

分析:一般是字符数组初始化时字符串长度大于字符数组长度,例如“char str =  “abcd”;”

11、error LNK1169: 找到一个或多个多重定义的符号”

有三个源文件,A.h、B.cpp、C.cpp。

A.h是头文件,其中声明了三个变量a1、a2、 a3。

B.cpp是A.h中所声明的类的实现源代码,C.cpp是主程序文件。B.cpp和C.cpp中均包含头文件 A.h。

12、#pragma warning(disable:4996)

这种微软的警告,主要因为那些C库的函数,很多函数内部是不进行参数检测的(包括越界类的),微软担心使用这些会造成内存异常,所以就改写了同样功能的函数,改写了的函数进行了参数的检测,使用这些新的函数会更安全和便捷。

如果你执意要用:请使用:#pragma
warning(disable:4996) //全部关掉

13、ld: symbol(s) not found for
architecture x86_64

出错原因:
main.cpp中没有找到对应的函数名声明,没有在.cpp引用包含该函数名的头文件.h。

解决方法: 引入对应头文件。

14、ld: 1 duplicate symbol for
architecture x86_64

出错原因:

main.cpp中和其它.c文件同时引入了相同的头文件,在main.cpp中调用头文件中的函数报错。

比如test.c和main.cpp同时通过include引入了test.h,然后在main.cpp中调用test.h中的printTest()函数。

解决方法:

去除test.c对test.h的引用。

15、与函数有关的错误

(1)所调用的函数在调用语句之后才定义,而又在调用前未声明;

(2)对函数声明与函数定义不匹配;

(3)误以为形参值的改变会影响实参的值;

(4)函数的实参和形参类型不一致;

(5)没有注意函数参数的求值顺序。

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?