1、TURBO C错误的说明TURBO C+错误大全 c+学习 2009-02-06 14:50:44 阅读315 评论0 字号:大中小 本附录列出的出错信息中用单引号括起的单词 代表一个通用的名或值,用户在屏幕上看到的出错信息是把这个单词用具体的名或值取代后的信息。例如:如果有一个C+函数goforit出现错误,用户在屏幕上看到的实际信息为: goforit must be declared with no arguments 要查阅这一条信息,必须找下面这一条信息: function must be declared with no arguments 下面列出本附录错误信息中用引号括起来的通
2、用名和值, 用户得到的出错信息应该先用相应的名或值取代,然后再查阅。 手册中看到的 屏幕上看到的 argument 一个命令行或其它参数 class 一个类名 field 一个域引用 filename 一个文件名(扩展名可有可无) group 一个组名 identifier 一个标识符(变量名或其它) Language 一个程序语言的名字 member 数据成员或成员函数的名字 message 一个信息串 module 一个模块名 number 一个实际数 option 一个命令行或其它选择项 parameter 一个参数名 segment 一个段名 specifier 一个类型说明符 sym
3、bol 一个符号 xxxxh 一个后面跟着h的4位十六进制数 本附录按ASCII字母顺序列出出错信息。以符号(等号,逗号,括号等 )开头的信息通常放在前面。 由于上表列举的变量开头的错误信息不能以在屏幕上实际看到的出错信息的字母顺序排 列,所以所有这类信息总是放在每个错误信息表的开始处。 如果变量出现在错误信息正文后面,例如: Incorrect command_Lineargument 那么可以按这条出错信息的字母顺序查找,此处可在“I”开头的信息中找。 一、运行错误 Turbo C+只有少量运行错误信息。下面按字母顺序列出。 Abnormal program termination程序不正
4、常结束。这是因为程序在运行时发现内存不够造成的。另外, 调用函数abort将显示出该信息。有些运行错误在最后将调用abort函数,因此会显示出该信息。 Divide by 0 用整数除以0。该错误可被signal函数探知。另外,还将调用abort函数,并使程序非正常结束。 Floating point error: Divide by 0 除数为0。如1.0/0.0。 Floating point error: Domain 结果不是一个数。如,0.0/0.0。 Floating point error: Overflow 在完全丢失精度的情况下,结果是+或-。如: double x=le20
5、0*le200 Floating point error: Partial loss of precision 在浮点操作时,丢失了精度。缺省时该错误被屏蔽,可调用control87来消除屏蔽。 Floating point error:Underflow 浮点操作时产生下溢,下溢值用0.0替换。缺省时该错误被屏蔽,可调用control87 来消除屏蔽。 Floating point error: Stack fault 浮点操作引起堆栈溢出。该错误不常出现,可能是由于汇编码使用的寄存器太多, 或者是没有说明浮点函数。 注意:上述这些浮点错误可以用函数control 187屏蔽,也可以用函数s
6、ignal捕获。另外,这些浮点错误还将调用函数abort。以打印出:Abnormal program termination。并调用exit(3)。 Null pointer assignment 当一个small或medium内存模式的程序退出时, 将检查程序数据段开头的若干个字节的内容是否改变。如果这些字节内容被改变,则显示该信息, 通常这是因为有一个值被存进一个未初始化的指针中。尽管产生这个错误的程序在其它方面看上去运行正常,但它反映程序内部有严重错误,应对其予以重视。对一个未初始化的指针间接赋值可能导致不可预料的后果(在large、compact 或huge内存模式下,还可能出现“死锁
7、”)。在集成调试器中可跟踪null指针。 Stack overflow Turbo C+程序中堆栈缺省大小是4096字节。这对于大多数程序来说是足够的,但是当程序执行复杂递归或大量使用局部数据时可能出现堆栈溢出。 只有当打开堆栈检查功能时才可能得到该信息。若要改正此错误,可以换用较大的内存模式试一试, 或者通过改变全局变量stklen的值来增加堆栈大小,还可以减少程序对堆栈的使用。为了减少函数的局部数据数量,可以将其说明为静态变量(static)。例如: void anyfunction(void) static int buf2000; /*分配在数据段中*/ int list 2000;
8、/*分配在堆栈中*/ 将局部变量说明为static,有两个缺点: 1.它将永久地占用全局变量和堆栈以外的空间,不过这还只是个小缺点。 2.若一个函数中的变量说明为静态的,那么该函数不能递归调用或异步调用。因为对于说明为Static的变量,每次调用函数时对该变量使用的是相同的空间而不是分开的空间。 二、编译错误 由Turbo C+编译器(TC或TCC)产生的诊断信息分为三类:致命错误、错误和警告。 致命错误:使得编译过程立即停止。应该采取适当的解决办法,然后重新编译。 错误:表示程序语法错误,磁盘或内存存取错误以及命令行错误。编译器将完成当前编译阶段,然后停止。并且编译器在每个编译阶段(预处理,
9、分析,优化和代码生成) 都将尽可能多地找出源程序中的真正错误。 警告:不终止编译过程。它表明条件有疑问,而这些条件作为语言的部分是合法的。当使用和机器有关的结构时,编译器总是生成警告信息。 编译器按下列格式显示信息:先是信息类型,然后是文件名和行号, 最后才是信息内容。在下面的每类信息中将按照字母顺序列出。 1. 致命错误 Bad call of inline function 在使用一个宏定义的内部函数(预定义的宏)时没有用正确的方式调用它。C中预定义的内部函数是以双下划线(_)为开头和结尾的. Irreducible expression tree 错误行上的某个表达式使得代码生成器无法产
10、生代码。这是一个编译器内部错误,这时将不翻译该表达式。如果编译器曾出现过该错误,请通知Borland公司。 Out of memory 编译时内存溢出。要么增加机器内存,如果你的机器已有640K内存, 就应该简化源文件。 Register allocation failure 错误行上的某个表达式太复杂,以致代码生成器无法产生该表达式的代码。这也是一个编译器内部错误。请简化该表达式。如果出现此错误,请通知Borland公司。 2.错误 constructorcannot return a value C+的构造函数的return语句不能有一个表达式作为返回值。 constructoris no
11、t a base class of class 一个C+的类构造函数class试图调用一个基类构造函数constructor,或者是你试图改变class:constructor的访问权限。constructor不是class的一个基类。检查你的说明。 functionlcannot be distinguished from function2 函数1和2的说明中参数类型表的差别不足以区分它们。 可尝试将某一个函数中的参数类型或参数次序改变一下。 functionis ambiguous 在函数调用中,不止一个重载函数的参数表可以和调用的参数表匹配(使用缺省的参数转换规则)。应该对一个或多个参
12、数进行显式类型转换来解决这种二义性问题。 functionmust be declared with no arguments该C+操作符函数不能有参数。 functionmust be declared with one argument该C+操作符函数只能有一个参数。 functionmust be declared with two arguments该C+操作符函数必须有两个参数。 functionwas previously declared without static该函数在此处说明为静态的,但在前面却已经说明为外部的(extern)或全局的。ANSI C不允许这种情况出现。 f
13、unctionwsa previously declared with the language language该函数在不同的地方用不同的语言修饰词(cdecl,pascal或interrupt)说明,这是错误的。 identifier cannot be declared in an anonymous union无名的联合中不能有成员函数或静态成员。无名的联合只能包含数据成员。 identifier cannot be used in static member function 一个静态的成员函数只能使用它所在的类中的静态成员,尽管它有完全的访问权限。此错误是由于试图使用一个需要用th
14、is指针的成员。 identifieris inaccessible because also in class 将一个类既作为直接基类又作为间接基类是不合法的。 可使基类在两处说明为虚拟的。 identifier is not a data member and cant be initialized here 在一个构造函数中只能对数据成员初始化。 此信息表示初始化表中含有一个静态成员或函数成员。 identifieris not a member of struct identifier被当作一个结构成员来引用,但它不是一个结构成员。请检查你的说明。 identifieris not a
15、 parameter 在一个旧形式函数定义的形参说明部分中idenitfier被说明,但却不是作为一个参数被列举的,可以去掉此说明或可把identifier作为一个参数。 identifieris not legal here 类型说明符identifier和其它类型名冲突或重复,或者它被当作一个typedef名字使用,而此时在这个作用域中它不是一个typedef名字。 identifieris virtual and cannot be explicitly initialized 一个C+类的构造函数试图调用一个基类构造函数identifier,但该基类是一个虚基类。 虚基类不能被显式地初
16、始化,编译程序会自动地隐含调用基类的缺省构造函数base:base()。 identifiermust be a member function 大多数C+的操作符函数可以是类成员或普通的非成员函数,但有一些只能是类的成员函数。这些是operator=、operator和operator()及以及类型转换。 identifiermust be a member function or have an argument of class type 大多数操作符函数必须有一个显式或隐式的类类型参数。 此操作符函数在类外说明且没有 一个显式的类类型参数。identifiermust be a pre
17、viously defined class or struct 企图把identifier说明为一个基类,但它不是一个类,或者它还没有被完全定义。 请修改该名字或重新排列这些说明。 identifier must be a previously defined enumeration tag 企图把identifier作为枚举标记使用,但是它还没有被说明。纠正此名字或将说明重新排 列。 identifiermust be a previouslyde fined structure tag企图把idebtififier作为结构标记作用,但是还没有被说明。纠正此名字或将说明重新排列。 ident
18、ifierspecifies multiple or duplicate access 一个基类可以被说明为public或private,但不能两者都有,该访问说明符对一个基类只能出现一次。 memberis not accessible C+类成员member被说明为private或protected,因此不能从该函数中引用。有时出现在企图调用一个可访问的重载成员函数(或构造函数)中,但是其参数匹配一个不可访问的函数。重载函数检查总是在可访问性检查之前完成,如果是这个问题,请试着用一个或多个参数的显式类型转换来选择期望的可访问函数。 specifierhas already been inc
19、luded 此类型说明符在当前说明中出现了一次以上,删除或改变其中的一次。 =expected 变量初始化时缺赋值运算符(=)。 ,expected 在一个说明表、初始化表或参数表中缺逗号(,)。 expected 一个块或初始化表的开头缺左花括号()。 (expected 参数表前缺左圆括号。 expected 一个块或初始化表的结尾缺右花括号() )expected 参数表尾缺右圆括号。 :expected after private /protected/public 保留字private/protected/public的后面必须是一个冒号(。 :requires a precedin
20、g identifier in this context 在一个说明中,C+双冒号(: 的前面必须有一个限定类名。而非限定的双冒号只能用在表达式中来指明全局作用域,而不能用在一个说明中。 .*operands do not match C+点星操作符(.*)的右边必须是一个指针,指向该操作符左边给出的类的一个成员。 #operator not followed by macro argument name 在宏定义中,#可用来指明将其后的宏参数替换为一个串,因此#后面必须是一个宏参数名。 Access can only be changed to public or protected 一个C
21、+派生类可以修改一个基类成员的访问权限,但是只能变为public或protected。 一个基类成员不能为private。 Access declarations cannot grant or reduce access 一个C+的派生类可以修改一个基类成员的访问权限,但只能恢复它为基类中的访问权限,不能加大或减少它的访问权限。 Access specifier specifier found in a union C+存取说明符public private protected不能用在联合中。 Ambiguity between functionl and function2 两个命名的重载
22、函数同时使用所提供的参数,不允许这种二义性。 Ambiguous conversion functions:typeland type2 企图用多种方法将一个已提供的类型转换到期望的类型。 Array bounds missing 在数组说明中缺右方括号()。 Array must have at least one element ANSI C和C+要求数组被定义为至少有一个元素。以前的一个程序设计技巧是把结构的数组成员说明为零元素长,然后用函数malloc来分配实际所需的空间。现在仍然可以使用这个技巧,但是数组长度至少有一个元素。当然,长度未知大小的数组说明(注意, 不同于定义)是允许的。
23、 例如: char ray; /*未知长度的定义_非法*/ char ray0; /*长度为0的定义_非法*/ extern char ray;/*未知长的说明_OK*/ Array of references is not allowed 引用类型的数组是非法的。 因为不允许有指向引用的指针和数组名被强制转换成指针。 Array size too large 数组长度超过64K字节。 Assembler statement too long 内嵌式汇编语句的代码长度不能超过480字节。 Attempting to return a reference to local name identi
24、fier 一个C+的函数返回一个引用类型,但你试图返回一个指向局部(自动)变量的引用, 这是非法的。因为在函数退出时这个引用所指的变量就没有了。可以返回一个指向任何静态的或全局变量的引用或者可以改变这个函数为返回一个值。 Bad file name format in include directive包含文件名必须用双引号(“”)或尖括号()括起来。 Bad ifdef directive syntax#指令必须有一个标识符(并且没有其它东西)作为指令体。 Bad ifndef directive syntax同前一条错误信息。 Bad return type for a type conv
25、ersion operator C+类型转换成员函数指定了一个不同于该类型本身的返回类型。对转换函数operator T 的说明不能指定任何返回类型。 Bad syntax for pure function definition 纯虚函数由说明时加=0来表示的。你写的程序与此类似,但不完全一样。 Bad undef directive syntax#undef指令必须有一个标识符(并且没有别的东西)作为指令体。 Base classclassis included more than once 一个C+的类可以从许多个基类直接派生而来,但一个指; 定的基类只能被直接派生一次。 Base cl
26、ass class is initialized more than once 在一个C+的类构造函数中,跟在构造函数头后面的初始化表不止一次包含了基类class。 Base class cannot be declared protected C+基类必须是public或private,但不能是protected。 Bit field cannot be static 只有普通的C+类数据成员可以被说明为static,而位域则不行。 Bit fields must by signed or unsigned int 位域必须被说明为一个有符号或无符号的整数类型。在ANSI C中,位域只能是s
27、igned或unsigned int类型,而不能是char或long等类型。 Bit fields must contain at least one bit 已命名的位域的宽度不能是零(或小于0)。而一个未命名位域的宽度可以是0,这是一种约定,用来将后面的位域成员的地址强制对齐为字节边界(或者是字边界,如果使用了-a选择项的话)。 Bit field too large 给出的位域宽度超过了16位。 Body already defined for this function 同一个函数只能有一个函数体。 Call of non-function 被调用的名字没有被说明为一个函数。可能是函数
28、说明有错或函数名拼错。 Cannot assign1identifier1 to identifier2 赋值运算符(=)(或复合赋值运算符,如+=)的两边必须类型兼容 ,且不能是数组。你企图把类型为identifier1右边表达式赋给类型为identifier2的左边目标。 Cannot call mainfrom within the program C+不允许递归调用函数main。 Canot cast from identifier1 to identifier2 类型identifier1到identifier2的强制转换是不允许的。 在C中,一个指针可以转换成整型或另一个指针。一个
29、整型可以转换为任何整型、浮点型或指针类型。一个浮点类型可以转换为一个整型或浮点类型。结构和数组不能互相转换。通常不能将一个Void类型转换。 在C+中,检查用户定义的转换和构造函数是否存在,如果不存在的话,就应用上述的规则(除了指向类成员的指针外)。在整型类型中,只有常数0可能转换成成员指针。 成员指针可能转换成一整型量或类似的成员指针。 如果一个成员指针原先指向一数据成员或函数成员;那么类似的成员指针也可指向一个数据成员或函数成员,进行类型转换的限定类必须是和原来相同的或是原来类的基类。 Cannot create Variable for abstract class class 抽象类_
30、那些具有纯虚函数的类_不能直接使用,只能用来派生其它类。 Connot define a pointer or reference to a reference 不允许有指向引用的指针或指向引用的引用。 Cannot find class:class (class&) to copy a vector 当一个C+的类class1包含有一个类clsaa2的数组(向量)时, 而你又想从类Class1的另一个对象中构造类Class1的一个对象,这就需要一个class2:class2(class2&的构造函数,这样数组元素才能被构造, 这个构造函数只有一个参数(指向它的类的引用)并称为一个引用构造函数。 通常编译程序自动地提供一个引用构造函数,但是你为类class2定义了一个构造
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1