TURBO C错误的说明.docx
《TURBO C错误的说明.docx》由会员分享,可在线阅读,更多相关《TURBO C错误的说明.docx(70页珍藏版)》请在冰豆网上搜索。
TURBOC错误的说明
TURBOC++错误大全c++学习2009-02-0614:
50:
44阅读315评论0字号:
大中小
本附录列出的出错信息中用单引号括起的单词代表一个通用的名或值,用户在屏幕上看到的出错信息是把这个单词用具体的名或值取代后的信息。
例如:
如果有一个C++函数goforit出现错误,用户在屏幕上看到的实际信息为:
goforitmustbedeclaredwithnoarguments
要查阅这一条信息,必须找下面这一条信息:
functionmustbedeclaredwithnoarguments
下面列出本附录错误信息中用引号括起来的通用名和值,用户得到的出错信息应该先用相应的名或值取代,然后再查阅。
手册中看到的屏幕上看到的
argument一个命令行或其它参数
class一个类名
field一个域引用
filename一个文件名(扩展名可有可无)
group一个组名
identifier一个标识符(变量名或其它)
Language一个程序语言的名字
member数据成员或成员函数的名字
message一个信息串
module一个模块名
number一个实际数
option一个命令行或其它选择项
parameter一个参数名
segment一个段名
specifier一个类型说明符
symbol一个符号
xxxxh一个后面跟着h的4位十六进制数
本附录按ASCII字母顺序列出出错信息。
以符号(等号,逗号,括号等)开头的信息通常放在前面。
由于上表列举的变量开头的错误信息不能以在屏幕上实际看到的出错信息的字母顺序排列,所以所有这类信息总是放在每个错误信息表的开始处。
如果变量出现在错误信息正文后面,例如:
Incorrectcommand__Lineargument
那么可以按这条出错信息的字母顺序查找,此处可在“I”开头的信息中找。
一、运行错误
TurboC++只有少量运行错误信息。
下面按字母顺序列出。
●Abnormalprogramtermination程序不正常结束。
这是因为程序在运行时发现内存不够造成的。
另外,调用函数abort将显示出该信息。
有些运行错误在最后将调用abort函数,因此会显示出该信息。
●Divideby0
用整数除以0。
该错误可被signal函数探知。
另外,还将调用abort函数,并使程序非正常结束。
●Floatingpointerror:
Divideby0
除数为0。
如1.0/0.0。
●Floatingpointerror:
Domain
结果不是一个数。
如,0.0/0.0。
●Floatingpointerror:
Overflow
在完全丢失精度的情况下,结果是+∞或-∞。
如:
doublex=le200*le200
●Floatingpointerror:
Partiallossofprecision
在浮点操作时,丢失了精度。
缺省时该错误被屏蔽,可调用control87来消除屏蔽。
●Floatingpointerror:
Underflow
浮点操作时产生下溢,下溢值用0.0替换。
缺省时该错误被屏蔽,可调用control87来消除屏蔽。
●Floatingpointerror:
Stackfault
浮点操作引起堆栈溢出。
该错误不常出现,可能是由于汇编码使用的寄存器太多,或者是没有说明浮点函数。
注意:
上述这些浮点错误可以用函数control187屏蔽,也可以用函数signal捕获。
另外,这些浮点错误还将调用函数abort。
以打印出:
Abnormalprogramtermination。
并调用exit(3)。
●Nullpointerassignment
当一个small或medium内存模式的程序退出时,将检查程序数据段开头的若干个字节的内容是否改变。
如果这些字节内容被改变,则显示该信息,通常这是因为有一个值被存进一个未初始化的指针中。
尽管产生这个错误的程序在其它方面看上去运行正常,但它反映程序内部有严重错误,应对其予以重视。
对一个未初始化的指针间接赋值可能导致不可预料的后果(在large、compact或huge内存模式下,还可能出现“死锁”)。
在集成调试器中可跟踪null指针。
●Stackoverflow
TurboC++程序中堆栈缺省大小是4096字节。
这对于大多数程序来说是足够的,但是当程序执行复杂递归或大量使用局部数据时可能出现堆栈溢出。
只有当打开堆栈检查功能时才可能得到该信息。
若要改正此错误,可以换用较大的内存模式试一试,或者通过改变全局变量stklen的值来增加堆栈大小,还可以减少程序对堆栈的使用。
为了减少函数的局部数据数量,可以将其说明为静态变量(static)。
例如:
voidanyfunction(void)
{
staticintbuf[2000];/*分配在数据段中*/
intlist[2000];/*分配在堆栈中*/
将局部变量说明为static,有两个缺点:
1.它将永久地占用全局变量和堆栈以外的空间,不过这还只是个小缺点。
2.若一个函数中的变量说明为静态的,那么该函数不能递归调用或异步调用。
因为对于说明为Static的变量,每次调用函数时对该变量使用的是相同的空间而不是分开的空间。
二、编译错误
由TurboC++编译器(TC或TCC)产生的诊断信息分为三类:
致命错误、错误和警告。
●致命错误:
使得编译过程立即停止。
应该采取适当的解决办法,然后重新编译。
●错误:
表示程序语法错误,磁盘或内存存取错误以及命令行错误。
编译器将完成当前编译阶段,然后停止。
并且编译器在每个编译阶段(预处理,分析,优化和代码生成)都将尽可能多地找出源程序中的真正错误。
●警告:
不终止编译过程。
它表明条件有疑问,而这些条件作为语言的部分是合法的。
当使用和机器有关的结构时,编译器总是生成警告信息。
编译器按下列格式显示信息:
先是信息类型,然后是文件名和行号,最后才是信息内容。
在下面的每类信息中将按照字母顺序列出。
1.致命错误
●Badcallofinlinefunction
在使用一个宏定义的内部函数(预定义的宏)时没有用正确的方式调用它。
C中预定义的内部函数是以双下划线(__)为开头和结尾的.
●Irreducibleexpressiontree
错误行上的某个表达式使得代码生成器无法产生代码。
这是一个编译器内部错误,这时将不翻译该表达式。
如果编译器曾出现过该错误,请通知Borland公司。
●Outofmemory
编译时内存溢出。
要么增加机器内存,如果你的机器已有640K内存,就应该简化源文件。
●Registerallocationfailure
错误行上的某个表达式太复杂,以致代码生成器无法产生该表达式的代码。
这也是一个编译器内部错误。
请简化该表达式。
如果出现此错误,请通知Borland公司。
2.错误
●constructorcannotreturnavalue
C++的构造函数的return语句不能有一个表达式作为返回值。
●constructorisnotabaseclassofclass
一个C++的类构造函数class试图调用一个基类构造函数constructor,或者是你试图改变class:
:
constructor的访问权限。
constructor不是class的一个基类。
检查你的说明。
●functionlcannotbedistinguishedfromfunction2
函数1和2的说明中参数类型表的差别不足以区分它们。
可尝试将某一个函数中的参数类型或参数次序改变一下。
●functionisambiguous
在函数调用中,不止一个重载函数的参数表可以和调用的参数表匹配(使用缺省的参数转换规则)。
应该对一个或多个参数进行显式类型转换来解决这种二义性问题。
●functionmustbedeclaredwithnoarguments该C++操作符函数不能有参数。
●functionmustbedeclaredwithoneargument该C++操作符函数只能有一个参数。
●functionmustbedeclaredwithtwoarguments该C++操作符函数必须有两个参数。
●functionwaspreviouslydeclaredwithoutstatic该函数在此处说明为静态的,但在前面却已经说明为外部的(extern)或全局的。
ANSIC不允许这种情况出现。
●functionwsapreviouslydeclaredwiththelanguagelanguage该函数在不同的地方用不同的语言修饰词(cdecl,pascal或interrupt)说明,这是错误的。
●identifiercannotbedeclaredinananonymousunion无名的联合中不能有成员函数或静态成员。
无名的联合只能包含数据成员。
●identifiercannotbeusedinstaticmemberfunction
一个静态的成员函数只能使用它所在的类中的静态成员,尽管它有完全的访问权限。
此错误是由于试图使用一个需要用this指针的成员。
●identifierisinaccessiblebecausealsoinclass
将一个类既作为直接基类又作为间接基类是不合法的。
可使基类在两处说明为虚拟的。
●identifierisnotadatamemberandcantbeinitializedhere
在一个构造函数中只能对数据成员初始化。
此信息表示初始化表中含有一个静态成员或函数成员。
●identifierisnotamemberofstruct
identifier被当作一个结构成员来引用,但它不是一个结构成员。
请检查你的说明。
●identifierisnotaparameter
在一个旧形式函数定义的形参说明部分中idenitfier被说明,但却不是作为一个参数被列举的,可以去掉此说明或可把identifier作为一个参数。
●identifierisnotlegalhere
类型说明符identifier和其它类型名冲突或重复,或者它被当作一个typedef名字使用,而此时在这个作用域中它不是一个typedef名字。
●identifierisvirtualandcannotbeexplicitlyinitialized
一个C++类的构造函数试图调用一个基类构造函数identifier,但该基类是一个虚基类。
虚基类不能被显式地初始化,编译程序会自动地隐含调用基类的缺省构造函数base:
:
base()。
●identifiermustbeamemberfunction
大多数C++的操作符函数可以是类成员或普通的非成员函数,但有一些只能是类的成员函数。
这些是operator=、operator→和operator()及以及类型转换。
●identifiermustbeamemberfunctionorhaveanargumentofclasstype
大多数操作符函数必须有一个显式或隐式的类类型参数。
此操作符函数在类外说明且没有一个显式的类类型参数。
●identifiermustbeapreviouslydefinedclassorstruct
企图把identifier说明为一个基类,但它不是一个类,或者它还没有被完全定义。
请修改该名字或重新排列这些说明。
●identifiermustbeapreviouslydefinedenumerationtag
企图把identifier作为枚举标记使用,但是它还没有被说明。
纠正此名字或将说明重新排列。
●identifiermustbeapreviouslydefinedstructuretag企图把idebtififier作为结构标记作用,但是还没有被说明。
纠正此名字或将说明重新排列。
●identifierspecifiesmultipleorduplicateaccess
一个基类可以被说明为public或private,但不能两者都有,该访问说明符对一个基类只能出现一次。
●memberisnotaccessible
C++类成员member被说明为private或protected,因此不能从该函数中引用。
有时出现在企图调用一个可访问的重载成员函数(或构造函数)中,但是其参数匹配一个不可访问的函数。
重载函数检查总是在可访问性检查之前完成,如果是这个问题,请试着用一个或多个参数的显式类型转换来选择期望的可访问函数。
●specifierhasalreadybeenincluded
此类型说明符在当前说明中出现了一次以上,删除或改变其中的一次。
●=expected
变量初始化时缺赋值运算符(=)。
●,expected
在一个说明表、初始化表或参数表中缺逗号(,)。
●{expected
一个块或初始化表的开头缺左花括号({)。
●(expected
参数表前缺左圆括号。
●}expected
一个块或初始化表的结尾缺右花括号(})
●)expected
参数表尾缺右圆括号。
●:
expectedafterprivate/protected/public
保留字private/protected/public的后面必须是一个冒号(。
●:
:
requiresaprecedingidentifierinthiscontext
在一个说明中,C++双冒号(:
的前面必须有一个限定类名。
而非限定的双冒号只能用在表达式中来指明全局作用域,而不能用在一个说明中。
●.*operandsdonotmatch
C++点星操作符(.*)的右边必须是一个指针,指向该操作符左边给出的类的一个成员。
●#operatornotfollowedbymacroargumentname
在宏定义中,#可用来指明将其后的宏参数替换为一个串,因此#后面必须是一个宏参数名。
●Accesscanonlybechangedtopublicorprotected
一个C++派生类可以修改一个基类成员的访问权限,但是只能变为public或protected。
一个基类成员不能为private。
●Accessdeclarationscannotgrantorreduceaccess
一个C++的派生类可以修改一个基类成员的访问权限,但只能恢复它为基类中的访问权限,不能加大或减少它的访问权限。
●Accessspecifierspecifierfoundinaunion
C++存取说明符publicprivateprotected不能用在联合中。
●Ambiguitybetweenfunctionlandfunction2
两个命名的重载函数同时使用所提供的参数,不允许这种二义性。
●Ambiguousconversionfunctions:
typelandtype2
企图用多种方法将一个已提供的类型转换到期望的类型。
●Arrayboundsmissing]
在数组说明中缺右方括号(])。
●Arraymusthaveatleastoneelement
ANSIC和C++要求数组被定义为至少有一个元素。
以前的一个程序设计技巧是把结构的数组成员说明为零元素长,然后用函数malloc来分配实际所需的空间。
现在仍然可以使用这个技巧,但是数组长度至少有一个元素。
当然,长度未知大小的数组说明(注意,不同于定义)是允许的。
例如:
charray[];/*未知长度的定义_非法*/
charray[0];/*长度为0的定义_非法*/
externcharray[];/*未知长的说明_OK*/
●Arrayofreferencesisnotallowed
引用类型的数组是非法的。
因为不允许有指向引用的指针和数组名被强制转换成指针。
●Arraysizetoolarge
数组长度超过64K字节。
●Assemblerstatementtoolong
内嵌式汇编语句的代码长度不能超过480字节。
●Attemptingtoreturnareferencetolocalnameidentifier
一个C++的函数返回一个引用类型,但你试图返回一个指向局部(自动)变量的引用,这是非法的。
因为在函数退出时这个引用所指的变量就没有了。
可以返回一个指向任何静态的或全局变量的引用或者可以改变这个函数为返回一个值。
●Badfilenameformatinincludedirective包含文件名必须用双引号(“”)或尖括号()括起来。
●Badifdefdirectivesyntax#指令必须有一个标识符(并且没有其它东西)作为指令体。
●Badifndefdirectivesyntax同前一条错误信息。
●Badreturntypeforatypeconversionoperator
C++类型转换成员函数指定了一个不同于该类型本身的返回类型。
对转换函数operatorT的说明不能指定任何返回类型。
●Badsyntaxforpurefunctiondefinition
纯虚函数由说明时加=0来表示的。
你写的程序与此类似,但不完全一样。
●Badundefdirectivesyntax#undef指令必须有一个标识符(并且没有别的东西)作为指令体。
●Baseclassclassisincludedmorethanonce
一个C++的类可以从许多个基类直接派生而来,但一个指;定的基类只能被直接派生一次。
●Baseclassclassisinitializedmorethanonce
在一个C++的类构造函数中,跟在构造函数头后面的初始化表不止一次包含了基类class。
●Baseclasscannotbedeclaredprotected
C++基类必须是public或private,但不能是protected。
●Bitfieldcannotbestatic
只有普通的C++类数据成员可以被说明为static,而位域则不行。
●Bitfieldsmustbysignedorunsignedint
位域必须被说明为一个有符号或无符号的整数类型。
在ANSIC中,位域只能是signed或unsignedint类型,而不能是char或long等类型。
●Bitfieldsmustcontainatleastonebit
已命名的位域的宽度不能是零(或小于0)。
而一个未命名位域的宽度可以是0,这是一种约定,用来将后面的位域成员的地址强制对齐为字节边界(或者是字边界,如果使用了-a选择项的话)。
●Bitfieldtoolarge
给出的位域宽度超过了16位。
●Bodyalreadydefinedforthisfunction
同一个函数只能有一个函数体。
●Callofnon-function
被调用的名字没有被说明为一个函数。
可能是函数说明有错或函数名拼错。
●Cannotassign1identifier1toidentifier2
赋值运算符(=)(或复合赋值运算符,如+=)的两边必须类型兼容,且不能是数组。
你企图把类型为identifier1右边表达式赋给类型为identifier2的左边目标。
●Cannotcallmainfromwithintheprogram
C++不允许递归调用函数main。
●Canotcastfromidentifier1toidentifier2
类型identifier1到identifier2的强制转换是不允许的。
在C中,一个指针可以转换成整型或另一个指针。
一个整型可以转换为任何整型、浮点型或指针类型。
一个浮点类型可以转换为一个整型或浮点类型。
结构和数组不能互相转换。
通常不能将一个Void类型转换。
在C++中,检查用户定义的转换和构造函数是否存在,如果不存在的话,就应用上述的规则(除了指向类成员的指针外)。
在整型类型中,只有常数0可能转换成成员指针。
成员指针可能转换成一整型量或类似的成员指针。
如果一个成员指针原先指向一数据成员或函数成员;那么类似的成员指针也可指向一个数据成员或函数成员,进行类型转换的限定类必须是和原来相同的或是原来类的基类。
●CannotcreateVariableforabstractclassclass
抽象类_那些具有纯虚函数的类_不能直接使用,只能用来派生其它类。
●Connotdefineapointerorreferencetoareference
不允许有指向引用的指针或指向引用的引用。
●Cannotfindclass:
:
class(class&)tocopyavector
当一个C++的类class1包含有一个类clsaa2的数组(向量)时,而你又想从类Class1的另一个对象中构造类Class1的一个对象,这就需要一个class2:
:
class2(class2&的构造函数,这样数组元素才能被构造,这个构造函数只有一个参数(指向它的类的引用)并称为一个引用构造函数。
通常编译程序自动地提供一个引用构造函数,但是你为类class2定义了一个构造