VC6.0常见问题

更新时间:2023-10-04 19:58:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1.VC6.0常见编译错误提示

(1)error C2001: newline in constant 编号:C2001

直译:在常量中出现了换行。 错误分析:

①字符串常量、字符常量中是否有换行。

②在这句语句中,某个字符串常量的尾部是否漏掉了双引号。

③在这语句中,某个字符创常量中是否出现了双引号字符“\,但是没有使用转义符“\\\。 ④在这句语句中,某个字符常量的尾部是否漏掉了单引号。

⑤是否在某句语句的尾部,或语句的中间误输入了一个单引号或双引号。 (2)error C2015: too many characters in constant 编号:C2015

直译:字符常量中的字符太多了。 错误分析:

单引号表示字符型常量。一般的,单引号中必须有且只能有一个字符(使用转义符时,转义符所表示的字符当作一个字符看待),如果单引号中的字符数多于4个,就会引发这个错误。 另外,如果语句中某个字符常量缺少右边的单引号,也会引发这个错误,例如: if (x == 'x || x == 'y') , … -

值得注意的是,如果单引号中的字符数是2-4个,编译不报错,输出结果是这几个字母的ASC码作为一个整数(int,4B)整体看待的数字。 (3)error C2137: empty character constant

编号:C2137

直译:空的字符定义。 错误分析:

原因是连用了两个单引号,而中间没有任何字符,这是不允许的。 (4)error C2018: unknown character '0x##'

编号:C2018

直译:未知字符‘0x##’。 错误分析:

0x##是字符ASC码的16进制表示法。这里说的未知字符,通常是指全角符号、字母、数字,或者直接输入了汉字。如果全角字符和汉字用双引号包含起来,则成为字符串常量的一部分,是不会引发这个错误的。

(5)error C2041: illegal digit '#' for base '8'

编号:C2141

直译:在八进制中出现了非法的数字‘#’(这个数字#通常是8或者9)。 错误分析:

如果某个数字常量以“0”开头(单纯的数字0除外),那么编译器会认为这是一个8进制数字。例如:“089”、“078”、“093”都是非法的,而“071”是合法的,等同于是进制中的“57”。 (6)error C2065: 'xxxx' : undeclared identifier 编号:C2065

直译:标识符“xxxx”未定义。 错误分析:

首先,解释一下什么是标识符。标志符是程序中出现的除关键字之外的词,通常由字母、数字和下划线组成,不能以数字开头,不能与关键字重复,并且区分大小写。变量名、函数名、类名、常量名等等,都是标志符。所有的标志符都必须先定义,后使用。标志符有很多种用途,所以错误也有很多种原因。

如果“xxxx”是一个变量名,那么通常是程序员忘记了定义这个变量,或者拼写错误、大小写错误所引起的,所以,首先检查变量名是否正确。(关联:变量,变量定义)

如果“xxxx”是一个函数名,那就怀疑函数名是否没有定义。可能是拼写错误或大小写错误,当然,也有可能是你所调用的函数根本不存在。还有一种可能,你写的函数在你调用所在的函数之后,而你有没有在调用之前对函数原形进行申明。(关联:函数申明与定义,函数原型)

如果“xxxx”是一个库函数的函数名,比如“sqrt”、“fabs”,那么看看你在cpp文件已开始是否包含了这些库函数所在的头文件(.h文件)。例如,使用“sqrt”函数需要头文件math.h。如果“xxxx”就是“cin”或“cout”,那么一般是没有包含“iostream.h”。(关联:#include,cin,cout) 如果“xxxx”是一个类名,那么表示这个类没有定义,可能性依然是:根本没有定义这个类,或者拼写错误,或者大小写错误,或者缺少头文件,或者类的使用在申明之前。(关联:类,类定义)

标志符遵循先申明后使用原则。所以,无论是变量、函数名、类名,都必须先定义,后使用。如使用在前,申明在后,就会引发这个错误。

C++的作用域也会成为引发这个错误的陷阱。在花括号之内变量,是不能在这个花括号之外使用的。类、函数、if、do(while)、for所引起的花括号都遵循这个规则。(关联:作用域) 前面某句语句的错误也可能导致编译器误认为这一句有错。如果你前面的变量定义语句有错误,编译器在后面的编译中会认为该变量从来没有定义过,以致后面所有使用这个变量的语句都报这个错误。如果函数申明语句有错误,那么将会引发同样的问题。 (7)error C2086: 'xxxx' : redefinition

编号:C2374

直译:“xxxx”重复申明。 错误分析:

变量“xxxx”在同一作用域中定义了多次。检查“xxxx”的每一次定义,只保留一个,或者更改变量名。

(8)error C2374: 'xxxx' : redefinition; multiple initialization 编号:C2374

直译:“xxxx”重复申明,多次初始化。 错误分析:

变量“xxxx”在同一作用域中定义了多次,并且进行了多次初始化。检查“xxxx”的每一次定义,只保留一个,或者更改变量名。

(9)C2143: syntax error : missing ';' before (identifier) 'xxxx' 编号:C2143

直译:在(标志符)“xxxx”前缺少分号。 错误分析:

这是VC6的编译期最常见的误报,当出现这个错误时,往往所指的语句并没有错误,而是它的上一句语句发生了错误。其实,更合适的做法是编译器报告在上一句语句的尾部缺少分号。上一句语句的很多种错误都会导致编译器报出这个错误:

上一句语句的末尾真的缺少分号。那么补上就可以了。

上一句语句不完整,或者有明显的语法错误,或者根本不能算上一句语句(有时候是无意中按到键盘所致)。

如果发现发生错误的语句是cpp文件的第一行语句,在本文件中检查没有错误,但其使用双引号包含了某个头文件,那么检查这个头文件,在这个头文件的尾部可能有错误。 (10)error C4716: 'xxx' : must return a value 编号:C4716

直译:“xxx”必须返回一个值。 错误分析:

函数声明了有返回值(不为void),但函数实现中忘记了return 返回值。要么函数确实没有返回值,则修改其返回值类型为void,要么在函数结束前返回合适的值。

(11) warning C4508: 'main' : function should return a value; 'void' return type assumed 编号:C4508

直译:main函数应该返回一个值;void返回值类型被假定。 错误分析:

函数应该有返回值,声明函数时应指明返回值的类型,确实无返回值的,应将函数返回值声明为void。若未声明函数返回值的类型,则系统默认为整型int。此处的错误估计是在main函数中没有return返回值语句,而main函数要么没有声明其返回值的类型,要么声明了。 warning类型的错误为警告性质的错误,其意思是并不一定有错,程序仍可以被成功编译、链接,但可能有问题、有风险。

(12)warning C4700: local variable 'xxx' used without having been initialized

编号:C4700

直译:警告局部变量“xxx”在使用前没有被初始化。 错误分析:

这是初学者常见的错误,例如以下程序段就会造成这样的警告,而且程序的确有问题,应加以修改,尽管编译、链接可以成功——若不修改,x的值到底是多少无法确定,是随机的,判断其是否与3相同没有意义,在运气不好的情况下,可能在调试程序的机器上运行时,结果看起来是对的,但更换计算机后再运行,结果就不对,初学者往往感到迷惑。 int x;

if (x==3) printf(\

2.VC60.0常见链接错误

(1)error LNK2001: unresolved external symbol _main 编号:LNK2001

直译:未解决的外部符号:_main。

错误分析:缺少main函数。看看main的拼写或大小写是否正确。 (2)error LNK2005: _main already defined in xxxx.obj 编号:LNK2005

直译:_main已经存在于xxxx.obj中了。

错误分析:

直接的原因是该程序中有多个(不止一个)main函数。这是初学C++的低年级同学在初次编程

时经常犯的错误。这个错误通常不是你在同一个文件中包含有两个main函数,而是在一个project(项目)中包含了多个cpp文件,而每个cpp文件中都有一个main函数。引发这个错误的过程一般是这样的:你写完成了一个C++程序的调试,接着你准备写第二个C++文件,于是你可能通过右上角的关闭按钮关闭了当前的cpp文件字窗口(或者没有关闭,这一操作不影响最后的结果),然后通过菜单或工具栏创建了一个新的cpp文件,在这个新窗口中,程序编写完成,编译,然后就发生了以上的错误。原因是这样的:你在创建第二个cpp文件时,没有关闭原来的项目,所以你无意中新的cpp文件加入你上一个程序所在的项目。切换到“File View”视图,展开“Source Files”节点,你就会发现有两个文件。

在编写C++程序时,一定要理解什么是Workspace、什么是Project。每一个程序都是一个Project(项目),一个Project可以编译为一个应用程序(*.exe),或者一个动态链接库(*.dll)。通常,每个Project下面可以包含多个.cpp文件,.h文件,以及其他资源文件。在这些文件中,只能有一个main函数。初学者在写简单程序时,一个Project中往往只会有一个cpp文件。Workspace(工作区)是Project的集合。在调试复杂的程序时,一个Workspace可能包含多个Project,但对于初学者的简单的程序,一个Workspace往往只包含一个Project。

当完成一个程序以后,写另一个程序之前,一定要在“File”菜单中选择“Close Workspace”项,已完全关闭前一个项目,才能进行下一个项目。避免这个错误的另一个方法是每次写完一个C++程序,都把VC6彻底关掉,然后重写打开VC6,写下一个程序。

3.如何对C语言设计合适的程序调试方案

让我们来分析并设计对如下程序进行调试的具体方法与手段(实际上,对不同的程序,都需要在分析其执行结果以及其程序编写结构的基础上,来设计相应的对其进行具体调试的方法与手段,宗旨是想方设法逐步缩小“侦察”范围,直到最后找到出错位置)。

该程序除main外,还有一个自定义函数f。若已经能确认调用f函数前计算出的res值(或s、d、q或r其中之一的结果值)不正确的话,则可像上一程序那样,在计算出res变量值的下一行(或在靠前一些的某一行)处设置断点,看到达那一断点处是否一切正常。若到达断点处的数据结果已经不正常的话,错误已经出现(出现在跟前或出现在前面,从而找到了错误或者缩小了“侦察”范围);若断点处仍然正常,可断言错误出现在后面,而后,①可又一次通过鼠标光标往更靠后一些的适当位置设置新断点,再一次“Debug→Run to Cursor”(一下向后“迈”过了许多行,再继续“侦察”!);②通过“单步执行”(Debug→StepOver),在重点怀疑的那一块地方仔细地逐行进行“侦察”。

注意,“Step Over”不会“跟踪”进入f函数内部,若怀疑f函数可能有问题的话,要通过使用“Debug→Step Into”进入f内部再进行细致调试(在不遇到函数调用的地方,“Step Over”与“Step Into”的功能是相同的。若通过“Step Into”进入到函数内部,单步执行若干步之后,若发现不再需要进行单步调试的话,可通过“Step Out”从函数内部返回到调用语句的下一语句处)。

作为练习,请读者利用这一程序对上述的调试方法与手段进行多方面的灵活使用与体验!可以看出,程序调试是一件很费时费力而又非常细致的工作,需要耐心,要通过不断的实践来总结与积累调试经验。至于VC6提供的其他调试方法与手段,这儿就不一一介绍了。

#include int f(int a) {

int b, c;

b = a + 5; c = 2*b + 100; return c; }

void main() {

int x=3, y=5;

int s, d, q, r, res, z;

s = x + y; d = x - y; q = x / y; r = x % y;

res = s + 2*d + 3*q + 4*r; printf(\z = f(36);

printf(\}

前面也提到过,通过“Run to Cursor”所设置并到达的断点是一个临时性的断点。实际上,VC6还提供设置与清除固定性断点的方法。设置固定性断点最简单的方法是:在某一程序行处,单击鼠标右键,在菜单中选择“Insert/Remove Breakpoint”项(通过左键单击该选项,此时该行前将出现一个圆形的黑点标志,意味着已经将该行设置成了固定断点)。

清除固定性断点的方法为:在具有圆形黑点标志的固定断点行处,单击鼠标右键,在菜单中选择“Remove Breakpoint”项(通过左键单击该选项,此时该行前的那一个圆形黑点标志将消失,意味着已经清除了该固定断点)。

设置了固定性断点后,通常通过“Build→Start Debug→Go”或“Debug→Go”选项使程序开始执行,直到遇到某断点或遇到程序结束而停止。

还要说明的是,可以随时设置任意多个固定性断点,也可以随时清除它们。通过使用菜单选项“Edit→Breakpoints”,会出现一个对话框,在其中的“Break at”文本框中键入要设置断点的程序行的行数信息(但通常是先通过鼠标光标选定某一程序行,再利用菜单选项进入上述对话框,而后通过点击“Break at”文本框右边的小三角按钮,并选定系统自动提供的程序行的行数,以免自己要真正地去数清楚那一行的行数),也能够在指定行处设置一个固定性断点(通过OK按钮确定);如果要清除某断点,可在“Breakpoints”列表栏中先选定它,之后单击Remove按钮。实际上,除位置断点外,通过“Edit→Breakpoints”,还可以设置数据断点,消

本文来源:https://www.bwwdw.com/article/h98d.html

Top