admin 管理员组文章数量: 887032
2023年12月16日发(作者:vb中cdate)
C语言常见错误及解决
1. error: invalid use of void expression,是因为有void型的变量或者函数返回值被使用了。
例如:
printf("%dn", sum(1,2));
void sum(int a, int b)
{
int s = a+b;
}
这里printf的第二个参数就是void,无法打印就会出现这样的错误。
2. error C2001: newline in constant
直译:在常量中出现了换行。
错误分析:
1.①字符串常量、字符常量中是否有换行。
2.②在这句语句中,某个字符串常量的尾部是否漏掉了双引号。
3.③在这语句中,某个字符创常量中是否出现了双引号字符“"〞,但是没有使用转义符“"〞。
4.④在这句语句中,某个字符常量的尾部是否漏掉了单引号。
5.⑤是否在某句语句的尾部,或语句的中间误输入了一个单引号或双引号。
3. error C2021: too many characters in constant
编号:C2021
直译:字符常量中的字符太多了。
错误分析:
单引号表示字符型常量。一般的,单引号中必须有且只能有一个字符(使用转义符时,转义符所表示的字符当作一个字符看待),如果单引号中的字符数多于4个,就会引发这个错误。
另外,如果语句中某个字符常量缺少右边的单引号,也会引发这个错误,例如:
if (x == 'x || x == 'y') { … }
值得注意的是,如果单引号中的字符数是2-4个,编译不报错,输出结果是这几个字母的ASC码作为一个整数(int,4B)整体看待的数字。
4. error C2137: empty character constant
编号:C2137
直译:空的字符定义。
错误分析:
原因是连用了两个单引号,而中间没有任何字符,这是不允许的。
5. error C2021: unknown character '0x##'
学习文档 仅供参考
编号:C2021
直译:未知字符‘0x##'。
错误分析:
0x##是字符ASC码的16进制表示法。这里说的未知字符,通常是指全角符号、字母、数字,或者直接输入了汉字。如果全角字符和汉字用双引号包含起来,那么成为字符串常量的一局部,是不会引发这个错误的。
6. error C2041: illegal digit '#' for base '8'
编号:C2141
直译:在八进制中出现了非法的数字‘#'(这个数字#通常是8或者9)。
错误分析:
如果某个数字常量以“0〞开头(单纯的数字0除外),那么编译器会认为这是一个8进制数字。例如:“089〞、“078〞、“093〞都是非法的,而“071〞是合法的,等同于是进制中的“57〞。
7. error C2065: 'xxxx' : undeclared identifier
编号:C2065
直译:标识符“xxxx〞未定义。
错误分析:
首先,解释一下什么是标识符。标志符是程序中出现的除关键字之外的词,通常由字母、数字和下划线组成,不能以数字开头,不能与关键字重复,并且区分大小写。变量名、函数名、类名、常量名等等,都是标志符。所有的标志符都必须先定义,后使用。标志符有很多种用途,所以错误也有很多种原因。
1.如果“xxxx〞是一个变量名,那么通常是程序员忘记了定义这个变量,或者拼写错误、大小写错误所引起的,所以,首先检查变量名是否正确。(关联:变量,变量定义)
2.如果“xxxx〞是一个函数名,那就疑心函数名是否没有定义。可能是拼写错误或大小写错误,当然,也有可能是你所调用的函数根本不存在。还有一种可能,你写的函数在你调用所在的函数之后,而你有没有在调用之前对函数原形进行申明。(关联:函数申明与定义,函数原型)
3.如果“xxxx〞是一个库函数的函数名,比方“sqrt〞、“fabs〞,那么看看你在cpp文件已开始是否包含了这些库函数所在的头文件(.h文件)。例如,使用“sqrt〞函数需要头文件math.h。如果“xxxx〞就是“cin〞或“cout〞,那么一般是没有包含“iostream.h〞。(关联:#include,cin,cout)
4.如果“xxxx〞是一个类名,那么表示这个类没有定义,可能性依然是:根本没有定义这个类,或者拼写错误,或者大小写错误,或者缺少头文件,或者类的使用在申明之前。(关联:类,类定义)
5.标志符遵循先申明后使用原那么。所以,无论是变量、函数名、类名,都必须先定义,后使用。如使用在前,申明在后,就会引发这个错误。
6.C++的作用域也会成为引发这个错误的陷阱。在花括号之内变量,是不能在这个花括号之外使用的。类、函数、if、do(while)、for所引起的花括号都遵循这个规那么。(关联:作用域)
7.前面某句语句的错误也可能导致编译器误认为这一句有错。如果你前面的变量定义语句学习文档 仅供参考
有错误,编译器在后面的编译中会认为该变量从来没有定义过,以致后面所有使用这个变量的语句都报这个错误。如果函数申明语句有错误,那么将会引发同样的问题。
8. error C2086: 'xxxx' : redefinition
编号:C2374
直译:“xxxx〞重复申明。
错误分析:
变量“xxxx〞在同一作用域中定义了屡次。检查“xxxx〞的每一次定义,只保存一个,或者更改变量名。
9. error C2374: 'xxxx' : redefinition; multiple initialization
编号:C2374
直译:“xxxx〞重复申明,屡次初始化。
错误分析:
变量“xxxx〞在同一作用域中定义了屡次,并且进行了屡次初始化。检查“xxxx〞的每一次定义,只保存一个,或者更改变量名。
10. C2143: syntax error : missing ';' before (identifier) 'xxxx'
编号:C2143
直译:在(标志符)“xxxx〞前缺少分号。
错误分析:
这是VC6的编译期最常见的误报,当出现这个错误时,往往所指的语句并没有错误,而是它的上一句语句发生了错误。其实,更适宜的做法是编译器报告在上一句语句的尾部缺少分号。上一句语句的很多种错误都会导致编译器报出这个错误:
1.上一句语句的末尾真的缺少分号。那么补上就可以了。
2.上一句语句不完整,或者有明显的语法错误,或者根本不能算上一句语句(有时候是无意中按到键盘所致)。
3.如果发现发生错误的语句是cpp文件的第一行语句,在本文件中检查没有错误,但其使用双引号包含了某个头文件,那么检查这个头文件,在这个头文件的尾部可能有错误。
11. error C4716: 'xxx' : must return a value
编号:C4716
直译:“xxx〞必须返回一个值。
错误分析:
函数声明了有返回值(不为void),但函数实现中忘记了return 返回值。要么函数确实没有返回值,那么修改其返回值类型为void,要么在函数结束前返回适宜的值。
12. warning C4508: 'main' : function should return a value; 'void' return
type assumed
学习文档 仅供参考
编号:C4508
直译:main函数应该返回一个值;void返回值类型被假定。
错误分析:
1.函数应该有返回值,声明函数时应指明返回值的类型,确实无返回值的,应将函数返回值声明为void。假设未声明函数返回值的类型,那么系统默认为整型int。此处的错误估计是在main函数中没有return返回值语句,而main函数要么没有声明其返回值的类型,要么声明了。
g类型的错误为警告性质的错误,其意思是并不一定有错,程序仍可以被成功编译、链接,但可能有问题、有风险。
g: conflicting types for built-in function 'puts'
【编译器版本】arm-linux-gcc 3.4.1【问题描述】在做嵌入式底层开发时,自己写了一个puts函数,也就是通过串口发送字符串到超级终端。但在编译程序的时候出现了如下问题: warning: conflicting types for built-in function 'puts' 【问题分析】 在C语言标准中,有些通用函数被定义为built-in function(内建函数),像printf,puts,strchr,memset等等,这些函数不需要包含头文件中的声明,就可以编译连接该函数的。但有时候你想自己实现,就会出现上面所示的冲突提示。 有的时候你不用包含一些头文件,也能使用那个里面包含的函数,可能是编译器包含了一些常用的简单的函数的处理,即便是你不包含头文件,编译器也知道到哪里找,但是如果是一些复杂的函数,或者是你自己写的静态库,你想使用时必须要包含;仅仅只是一些简单的函数你不用包含头文件而已。【解决方法】1.在编译是加上-fno-builtin或者-fno-builtin-FUNCTION 选项,你就可以自己实现这些函数而不冲突了。例如在上面的提示中,你编译时加上-fno-builtin-puts ,就可以正常编译了。2.把这些函数改个名称,以便不冲突。
14. warning C4700: local variable 'xxx' used without having been initialized
编号:C4700
直译:警告局部变量“xxx〞在使用前没有被初始化。
错误分析:
这是初学者常见的错误,例如以下程序段就会造成这样的警告,而且程序确实有问题,应加以修改,尽管编译、链接可以成功——假设不修改,x的值到底是多少无法确定,是随机的,判断其是否与3相同没有意义,在运气不好的情况下,可能在调试程序的机器上运行时,结果看起来是对的,但更换电脑后再运行,结果就不对,初学者往往感到迷惑。
int x;
if (x==3) printf("hello");
15 [Error] ld returned 1 exit status
把zifulingxing(n); 注释了就行
16. [Warning] passing argument 2 of 'strcmp' makes pointer from integer without
string 是字符 不能拿来跟字符串比较·········
学习文档 仅供参考
学习文档 仅供参考
版权声明:本文标题:C语言常见错误提示及解决办法 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1702701562h427363.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论