gcc 常见的编译警告与错误(按字母顺序排列)备课讲稿

合集下载

GCC常见错误解析

GCC常见错误解析

GCC常见错误解析一、错误类型第一类∶C语法错误错误信息∶文件source.c中第n行有语法错误(syntex errror)。

这种类型的错误,一般都是C语言的语法错误,应该仔细检查源代码文件中第n行及该行之前的程序,有时也需要对该文件所包含的头文件进行检查。

有些情况下,一个很简单的语法错误,gcc会给出一大堆错误,此时要保持清醒的头脑,不要被其吓倒,必要的时候再参考一下C语言的基本教材。

第二类∶头文件错误错误信息∶找不到头文件head.h(Can not find include file head.h)。

这类错误是源代码文件中的包含头文件有问题,可能的原因有头文件名错误、指定的头文件所在目录名错误等,也可能是错误地使用了双引号和尖括号。

第三类∶档案库错误错误信息∶连接程序找不到所需的函数库,例如∶ld: -lm: No such file or directory.这类错误是与目标文件相连接的函数库有错误,可能的原因是函数库名错误、指定的函数库所在目录名称错误等,检查的方法是使用find命令在可能的目录中寻找相应的函数库名,确定档案库及目录的名称并修改程序中及编译选项中的名称。

第四类∶未定义符号错误信息∶有未定义的符号(Undefined symbol)。

这类错误是在连接过程中出现的,可能有两种原因∶一是使用者自己定义的函数或者全局变量所在源代码文件,没有被编译、连接,或者干脆还没有定义,这需要使用者根据实际情况修改源程序,给出全局变量或者函数的定义体;二是未定义的符号是一个标准的库函数,在源程序中使用了该库函数,而连接过程中还没有给定相应的函数库的名称,或者是该档案库的目录名称有问题,这时需要使用档案库维护命令ar检查我们需要的库函数到底位于哪一个函数库中,确定之后,修改gcc 连接选项中的-l和-L项。

排除编译、连接过程中的错误,应该说这只是程序设计中最简单、最基本的一个步骤,可以说只是开了个头。

c语言常见编译错误提示

c语言常见编译错误提示

c语言常见编译错误提示1) error C2001: newline in constant编号:C2001直译:在常量中出现了换行。

错误分析:1.字符串常量、字符常量中是否有换行。

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

3.在这语句中,某个字符创常量中是否出现了双引号字符“"”,但是没有使用转义符“\"”。

4.在这句语句中,某个字符常量的尾部是否漏掉了单引号。

5.是否在某句语句的尾部,或语句的中间误输入了一个单引号或双引号。

2) error C2015: too many characters in constant编号:C2015直译:字符常量中的字符太多了。

错误分析:单引号表示字符型常量。

一般的,单引号中必须有且只能有一个字符(使用转义符时,转义符所表示的字符当作一个字符看待),如果单引号中的字符数多于4个,就会引发这个错误。

另外,如果语句中某个字符常量缺少右边的单引号,也会引发这个错误,例如:i f (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)。

常见gcc 编译错误整理

常见gcc 编译错误整理

常见gcc 编译错误整理(开始)11 error: expected expression before 'else'else之前无表达式。

2 error: lvalue required as left operand of assignment左值问题。

3 error: invalid storage class for function 'XXXXXX'在文件的某个地方,丢失了一个大括号‘}’。

常见gcc编译警告整理(开始)1、warning: no newline at end of file在文件最后一行加上回车键解释:在《Rationale for the C99 standard》一文中,有C99的相关信息:A backslash immediately before a newline has long been used to continue string literals, as well as preprocessing command lines. In the interest of easing machine generation of C, and of transporting code to machines with restrictive physical line lengths, the C89 Committee generalized this mechanism to permit any token to be continued by interposing abackslash/newline sequence.c/c++代码的每一行后面有一个“结束符”,也就是newline。

避免当被include的文件展开后,前一个文件的最后一行与后一个文件的第一行直接被连接成一行从而造成错误。

2、warning: comparison between pointer and integer解释:integer与pointer比较3、 warning: assignment discards qualifiers from pointer target type解释:赋值时,取消了右值的限定。

GCC警告选项例解

GCC警告选项例解

GCC警告选项例解程序员是追求完美的一族,即使是一般的程序员大多也都不想看到自己的程序中有甚至那么一点点的瑕疵。

遇到任意一条编译器警告都坚决不放过。

有人会说:我们可以使用比编译器更加严格的静态代码检查工具,如splint。

这个建议也很不错。

不过lint工具使用起来较繁琐,有时候还需要记住一些特定符号并插入到你自己的代码中才行,门槛较高,这也让很多人止步于此。

那么我们就从此放弃么?不,如今的编译器做得都很好,它可以帮助我们的找到绝大多数可能出现问题的代码,前提是你要学会控制编译器去找到这些问题代码,而熟悉编译器的警告选项恰恰是体现控制力的好方法。

当你可以自如控制编译器警告输出的时候,你就算是'入道'了,同时你对语言的理解也更进一步了。

有人说:我就是用一个-Wall选项就可以了,一般选手可以这么做,而且他可以不知道-Wall会跟踪哪些类型的问题;但是高级选手是不会只使用-Wall的,他会把每条警告都研究的很透彻,会在Makefile中列出他想让编译器输出哪些类型的警告以替代-Wall,他会屏蔽掉那些对他的代码'毫无用处'的警告(很可能他使用了编译器对语言的扩展功能),他会有个和编译器交流的过程。

俗话说:'工欲善其事,必先利其器',一直在工作中使用GNU C编译器(以下简称GCC),这里对GCC的一些警告选项细致的分析,并列举几个简单的例子[注1]供分析参考。

1. -Wall集合警告选项我们平时可能大多数情况只使用-Wall编译警告选项,实际上-Wall选项是一系列警告编译选项的集合。

下面逐一分析这一集合中的各个选项:[-Wchar-subscripts]如果数组使用char类型变量做为下标值的话,则发出警告。

因为在某些平台上char可能默认为signed char,一旦溢出,就可能导致某些意外的结果。

e.g./* test_signed_char.c */#includeint main () {char c = 255; // 我们以为char是无符号的,其范围应该是[0,255]int i = 0;int a[256];for (i = 0; i < 256; i++) {a[i] = 1;}printf("%d\n", c); // 我们期待输出255printf("%d\n", a[c]); // 我们期待输出1printf("%d\n", a[255]);return 0;}gcc -Wchar-subscripts test_signed_char.ctest_signed_char.c: In function `main':test_signed_char.c:13: warning: array subscript has type `char'其输出结果:-1-41974761从输出结果来看Solaris 9/gcc 3.2上char默认实现类型为signed char;在Windows XP/gcc-3.4.2上也是一样。

gcc警告手册

gcc警告手册

gcc警告手册GCC(GNU Compiler Collection)是一款开源的编译器,用于将源代码编译成可执行文件。

在使用GCC编译代码时,可能会遇到各种警告信息,这些警告信息可以帮助我们发现代码中的潜在问题。

下面是一个关于GCC警告信息的800字左右的说明手册:一、概述GCC在编译过程中会输出警告信息,这些信息通常用于指出代码中可能存在的问题,如未使用的变量、未初始化的变量、潜在的类型不匹配等。

正确理解和处理这些警告信息可以帮助我们提高代码质量,减少潜在的错误和缺陷。

二、常见警告类型1.未使用的变量:当一个变量在定义后从未被使用时,GCC会发出这种警告。

这可能是由于变量名拼写错误、逻辑错误或者变量定义多余。

2.未初始化的变量:当一个变量在使用前未被初始化时,GCC会发出这种警告。

未初始化的变量可能导致不确定的行为,因此应该避免使用未初始化的变量。

3.潜在的类型不匹配:当一个变量的类型与其被赋予的值不匹配时,GCC会发出这种警告。

这可能是由于类型转换错误、函数返回值类型不匹配等原因引起的。

4.函数未声明:当一个函数在调用前未被声明时,GCC 会发出这种警告。

应该确保所有调用的函数都已在调用前声明或定义。

5.数组越界:当数组下标越界时,GCC会发出这种警告。

这可能是由于数组下标计算错误或者逻辑错误引起的。

6.除以零:当一个整数被零除时,GCC会发出这种警告。

应该避免整数被零除的情况。

7.丢失符号:当链接器找不到某个符号(如函数或变量)的定义时,GCC会发出这种警告。

这可能是由于编译选项错误、遗漏了某个源文件等原因引起的。

三、处理警告的方法1.检查代码逻辑:对于未使用的变量和未初始化的变量等警告,需要检查代码逻辑是否正确,确保每个变量都有正确的用途和初始化。

2.类型转换:对于潜在的类型不匹配等警告,可以使用类型转换来确保数据类型匹配。

3.函数声明:对于函数未声明等警告,需要确保所有调用的函数都已在调用前声明或定义。

c语言常见编译错误提示

c语言常见编译错误提示

1) error C2001: newline in constant编号:C2001直译:在常量中出现了换行。

错误分析:1.字符串常量、字符常量中是否有换行。

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

3.在这语句中,某个字符创常量中是否出现了双引号字符“"”,但是没有使用转义符“\"”。

4.在这句语句中,某个字符常量的尾部是否漏掉了单引号。

5.是否在某句语句的尾部,或语句的中间误输入了一个单引号或双引号。

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)。

gcc报告解读 -回复

gcc报告解读 -回复

gcc报告解读-回复GCC(GNU C Compiler)是一种开源的C语言编译器,被广泛用于编译C语言程序。

本文将重点解读GCC编译器的报告,包括其生成的常见信息、报告的内容和作用,以及如何解读报告中的警告和错误信息。

一、报告的生成和常见信息1. 编译过程中,GCC编译器会生成一个报告,其中包含了编译过程的详细信息。

该报告通常保存在默认的文件名为“filename.gcc”的文件中。

2. 报告中包含了许多常见信息,例如编译器的版本、编译选项、目标平台等。

这些信息对于开发者来说非常重要,它们可以帮助开发者了解编译器的配置以及编译环境的设置。

3. 报告中还包含了生成的中间代码(Intermediate Code),这是编译过程中生成的一种类似于汇编语言的中间表示形式。

中间代码是将源代码转化为目标代码的过程中的一个中间步骤,它可以方便开发者进行调试和优化。

二、报告的内容和作用1. 报告中的内容主要包括三个部分:编译器的配置信息,源代码的统计信息和警告/错误信息。

2. 编译器的配置信息可以告诉开发者使用的编译器版本、编译选项和目标平台等相关信息,开发者可以根据这些信息对代码进行进一步的优化和调整。

3. 源代码的统计信息包括代码行数、函数个数、变量个数等。

这些统计信息可以帮助开发者了解代码的规模和复杂度,进而对代码进行优化和重构。

4. 警告/错误信息是报告中最重要的部分。

GCC编译器会对源代码进行静态分析,检测出潜在的问题,并生成相应的警告或错误信息。

开发者可以根据这些信息来修复代码中的问题,以保证程序的正确性和性能。

三、解读报告中的警告和错误信息1. 警告信息(Warnings)是指编译器对代码中的潜在问题发出的警告信号。

这些问题可能不会导致程序错误,但有可能会影响程序的正确性或性能。

需要注意的是,虽然警告信息并不是错误,但也不应该被忽略,开发者应该根据警告信息来进行代码修正,以避免潜在的问题。

2. 错误信息(Errors)是指编译器在编译过程中发现的无法继续编译的问题。

C语言编程时的错误提示(按字母顺序)

C语言编程时的错误提示(按字母顺序)

C语言编程时的错误提示(按字母顺序)Ambiguous operators need parentheses不明确的运算,需要用括号括起来Ambiguous symbol 'xxx'不明确的符号Argument list syntax error参数表语法错误Array bounds missing丢失数组界限符Array size too large数组尺寸太大Bad character in parameters参数中有不适当的字符Bad file name format in include directive包含命令中文件名格式不正确Bad ifdef directive syntax编译预处理ifdef有语法错误Bad ifndef directive syntax编译预处理ifndef有语法错误Bad undef directive syntax编译预处理undef有语法错误Call of non-function调用未定义的函数Call to function with no prototype调用函数时没有函数的说明Cannot modify a const object不允许修改常量对象Case outside of switchCase 出现在switch 之外Case statement missing漏掉了Case 语句Case syntax errorCase 语法错误Case outside of switchCase 出现在switch 之外Case statement missing漏掉了Case 语句Case syntax errorCase 语法错误Code has no effect代码不可能执行到Compound statement missing }复合语句漏掉了"}"Conflicting type modifiers不明确的类型说明符Constant expression required要求常量表达式Constant out of range in comparison 在比较中常量超出范围Conversion may lose significant digits 转换时会掉失有意义的数字Conversion of near pointer not allowed 不允许转换返指针Could not find file 'xxx'找不到xxx文件Declaration missing ;说明缺少分号";"Declaration syntax error说明中出现语法错误Default outside of switchdefault出现在switch语句之外Define directive needs an identifier 定义编译预处理需要标识符Division by zero用零作除数Do statement must have whiledo-while语句中缺少while部分Enum syntax error枚举类型语法错误Enumeration constant syntax error 枚举常数语法错误Error directive: xxx错误的编译预处理命令Error writing output file写输出文件错误Expression syntax error表达式语法错误Extra parameter in call调用时出现多余错误File name too long文件名太长Function call missing )函数调用缺少右括号Function definition out of place函数定义位置错误Function should return a value函数返回一个值Goto statement missing labelgoto 语句没有标号Hexadecimal or octal constant too large 16进制或8进制常数太大Illegal character 'x'非法字xIllegal initialization非法的初始化Illegal octal digit非法的8进制数字Illegal pointer subtraction非法的指针相减Illegal structure operation非法的结构体操作Illegal use of pointer指针使用非法Improper use of a typedef symbol类型符号定义使用不恰当In-line assembly not allowed不允许使用行间汇编Incompatible storage class存储类别不相容Incompatible type conversion不相容的类型转换Incorrect number format错误的数据格式Incorrect use of defaultdefault使用不正确Invalid indirection无效的间接运算Invalid pointer addition指针相加无效Irreducible expression tree无法执行的表达式运算Lvalur required需要逻辑值(0或非0值)Macro argument syntax error宏参数语法错误Macro expansion too long宏的扩展以后太长Mismatched number of parameters in definition 定义中参数个数不匹配Misplaced break此处不应出现break语句Misplaced continue此处不应出现continue语句Misplaced decimal point此处不应出现小数点Misplaced elif directive此处不应出现编译预处理elifMisplaced else此处不应出现elseMisplaced else directive此处不应出现编译预处理elseMisplaced endif directive此处不应出现编译预处理endifMust be addressable必须是可以编址的Must take address of memory location必须存储定位的地址No declaration for function 'xxx'没有函数xxx 的说明No stack缺少堆栈No type information没有类型信息Non-portable pointer assignment不可移动的指针(地址常数)赋值Non-portable pointer comparison不可移动的指针(地址常数)比较Non-portable pointer conversion不可移动的指针(地址常数)转换Not a valid expression format type不合法的表达式格式Not an allowed type不允许使用的类型Numeric constant too large数值常数太大Out of memory内存不够用Parameter 'xxx' is never used参数xxx 没有用到Pointer required on left side of -> -> 符号的左边必须是指针Possible use of 'xxx' before definition 在定义之前就使用了xxx(警告)Possibly incorrect assignment赋值可能不正确Redefinition of 'xxx' is not identicalxxx 的两次定义不一致Register allocation failure寄存器定址失败Repeat count needs an lvalue重复计数需要逻辑值Size of structure or array not known 结构体或数组的大小不确定Statement missing ;语句后缺少";"Structure or union syntax error结构体或联合体语法错误Structure size too large结构体的尺寸太大Subscripting missing ]下标缺少右方括号Superfluous &with function or array 函数或数组中有多余的"&"Suspicious pointer conversion可疑的指针转换Symbol limit exceeded符号超限Too few parameters in call函数调用时的实参少于函数的参数Too many error or warning messages 错误或警告信息太多Too much auto memory in function函数中用到的局部存储太多Too much global data defined in file 文件中全局数据太多Too consecutive dots两个连续的句点Type mismatch in parameter xxx参数xxx类型不匹配Type mismatch in redeclaration of 'xxx'xxx 重定义时的类型不匹配Unable to create output file 'xxx'无法建立输出文件xxxUnable to open include file 'xxx'无法打开被包容的文件xxxBit field too large位字段太长Unable to open input file 'xxx'无法打开输入文件xxxUndefined label 'xxx'没有定义的标号xxxUndefined structure 'xxx'没有定义的结构xxxUndefined symbol 'xxx'没有定义的符号xxxUnexpected end of file in comment started on line xxx 从xxx 行开始的注解尚未结束,文件不能结束Unexpected end of file in conditional started on line xxx 从xxx 行开始的条件语句尚未结束,文件不能结束Unknown assembler instruction未知的汇编结构Unknown option未知的操作Unknown preprocessor directive: 'xxx'不认识的预处理命令xxxUnreachable code无法到达的代码Unterminated string or character constant字符串缺少引号User break用户强行中断了程序Void functions may not return a valuevoid 类型的函数不应有返回值Wrong number off arguments调用函数时参数数目错'xxx' not an argumentxxx 不是参数'xxx' not part of structurexxx 不是结构体的一部分xxx statement missing (xxx 语句缺少左括号xxx statement missing )xxx 语句缺少右括号xxx statement missing ;xxx 语句缺少分号'xxx' declared but never used说明了xxx ,但没有使用'xxx' is assigned a value which is never used 给xxx 赋了值,但未用过Zero length structure结构体的长度为零。

如何解决C语言中的编译错误与警告

如何解决C语言中的编译错误与警告

如何解决C语言中的编译错误与警告C语言是一种广泛应用于系统编程和嵌入式开发的编程语言,它的编译过程中常常会出现各种错误和警告。

这些错误和警告可能会导致程序无法正确编译或者在运行时出现问题。

因此,解决C语言中的编译错误与警告是每个程序员都需要掌握的重要技能。

本文将介绍一些常见的编译错误和警告,并提供一些解决方法。

一、理解编译错误和警告的含义在解决编译错误和警告之前,我们首先需要理解它们的含义。

编译错误是指在编译过程中发现的语法错误或者逻辑错误,这些错误会导致程序无法正确编译。

编译警告是指在编译过程中发现的一些潜在的问题,虽然不会导致程序无法编译,但可能会导致程序在运行时出现问题。

二、常见的编译错误和警告1. 语法错误:语法错误是最常见的编译错误之一,它通常是由于编程人员在编写代码时遗漏了分号、括号不匹配等导致的。

解决语法错误的方法是仔细检查代码,确保语法正确。

2. 未声明的标识符:当使用一个未声明的标识符时,编译器会报错。

解决这个问题的方法是在使用标识符之前先进行声明或者引入相应的头文件。

3. 类型不匹配:类型不匹配是指在赋值或者函数调用过程中,变量的类型与期望的类型不一致。

解决这个问题的方法是检查变量的类型,并进行相应的类型转换。

4. 未使用的变量:编译器会对未使用的变量发出警告,这可能是由于代码中存在一些无用的变量。

解决这个问题的方法是删除未使用的变量或者对其进行使用。

5. 未初始化的变量:未初始化的变量可能导致程序在运行时出现未定义的行为。

解决这个问题的方法是在使用变量之前先进行初始化。

6. 函数返回值不匹配:函数的返回值类型与函数定义时声明的返回值类型不一致会导致编译错误。

解决这个问题的方法是检查函数的返回值类型,并进行相应的修改。

7. 潜在的内存泄漏:编译器可能会对未释放的内存发出警告,这可能会导致内存泄漏。

解决这个问题的方法是在使用完内存后及时释放。

三、解决编译错误和警告的方法1. 仔细阅读编译错误和警告信息:编译器通常会提供详细的错误和警告信息,我们应该仔细阅读这些信息,找出问题所在。

常见gcc编译问题解决方法集

常见gcc编译问题解决方法集

常见gcc编译问题解决⽅法集除⾮明确说明,本⽂内容仅针对x86/x86_64的Linux开发环境,有朋友说baidu不到,开个贴记录⼀下(加粗字体是关键词):⽤“-Wl,-Bstatic”指定链接静态库,使⽤“-Wl,-Bdynamic”指定链接共享库,使⽤⽰例:-Wl,-Bstatic -lmysqlclient_r -lssl -lcrypto -Wl,-Bdynamic -lrt -Wl,-Bdynamic -pthread -Wl,-Bstatic -lgtest ("-Wl"表⽰是传递给链接器ld的参数,⽽不是编译器gcc/g++的参数。

)1) 下⾯是因为没有指定链接参数-lz(/usr/lib/libz.so,/usr/lib/libz.a )/usr/local/mysql/lib/mysql/libmysqlclient.a(my_compress.c.o): In function `my_uncompress':/home/software/mysql-5.5.24/mysys/my_compress.c:122: undefined reference to `uncompress'/usr/local/mysql/lib/mysql/libmysqlclient.a(my_compress.c.o): In function `my_compress_alloc':/home/software/mysql-5.5.24/mysys/my_compress.c:71: undefined reference to `compress'2) 下⾯是因为没有指定编译链接参数-pthread(注意不仅仅是-lpthraed)/usr/local/mysql/lib/mysql/libmysqlclient.a(charset.c.o): In function `get_charset_name':/home/zhangsan/mysql-5.5.24/mysys/charset.c:533: undefined reference to `pthread_once'3) 下⾯这个是因为没有指定链接参数-lrt/usr/local/thirdparty/curl/lib/libcurl.a(libcurl_la-timeval.o): In function `curlx_tvnow':timeval.c:(.text+0xe9): undefined reference to `clock_gettime'4) 下⾯这个是因为没有指定链接参数-ldl/usr/local/thirdparty/openssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup':dso_dlfcn.c:(.text+0x4c): undefined reference to `dlopen'dso_dlfcn.c:(.text+0x62): undefined reference to `dlsym'dso_dlfcn.c:(.text+0x6c): undefined reference to `dlclose'5) 下⾯这个是因为指定了链接参数-static,它的存在,要求链接的必须是静态库,⽽不能是共享库ld: attempted static link of dynamic object如果是以-L加-l⽅式指定,则⽬录下必须有.a⽂件存在,否则会报-l的库⽂件找不到:ld: cannot find -lACE6) GCC编译遇到如下的错误,可能是因为在编译时没有指定-fPIC,记住:-fPIC即是编译参数,也是链接参数relocation R_x86_64_32S against `vtable for CMyClass` can not be used when making a shared object7) 下⾯的错误表⽰gcc编译时需要定义宏__STDC_FORMAT_MACROS,并且必须包含头⽂件inttypes.htest.cpp:35: error: expected `)' before 'PRIu64'8) 下⾯是因为在x86机器(32位)上编译没有指定编译参数-march=pentium4../../src/common/libmooon.a(logger.o): In function `atomic_dec_and_test':../../include/mooon/sys/atomic_gcc.h:103: undefined reference to `__sync_sub_and_fetch_4'9) 下列错误可能是因为多了个“}”error: expected declaration before '}' token10) 下列错误可能是因为少了个“}”error: expected `}' at end of input11) 下⾯这个错误是编译⼀个共享库时,该共享库依赖的⼀静态库编译时没有加“-fPIC”参数,解决⽅法为带“-fPIC”重新编译被依赖的静态库relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC12) 下⾯这个错误,是因为头⽂件中使⽤“_syscall0(pid_t, gettid)”不当引起的./test.o: In function `gettid()':./test.h:17: multiple definition of `gettid()'正确的⽤法是使⽤"inline"或"static inline"修饰⼀下:inline _syscall0(pid_t, gettid)或static inline _syscall0(pid_t, gettid)当然也可以这样:在.h头⽂件中:extern "C" pid_t gettid(void);在.cpp⽂件中:_syscall0(pid_t, gettid)_syscall0是⼀个宏,定义⼀个函数的实现。

C语言编译中的常见错误

C语言编译中的常见错误

C语言编译中的常见错误1、警告类错误?‘XXX’declare but never used变量XXX已定义但从未用过。

?‘XXX’is assigned a value which is never used变量XXX已赋值但从未用过。

?Code has no effect 程序中含有没有实际作用的代码。

?Non-portable pointer conversion不适当的指针转换,可能是在应该使用指针的地方用了一个非0的数值。

?Possib le use of ‘XXX’before definition表达式中使用了未赋值的变量?Possibly incorrect assignment这样的赋值可能不正确?Redeclaration of ‘main’一个程序文件中主函数main不止一个。

?Suspicious pointer conversion可疑的指针转换。

通常是使用了基本类型不匹配的指针。

?Unreachable code程序含有不能执行到的代码。

2、错误或致命错误?Compound statement missing } in function main程序结尾缺少括号}。

?“}”expected;“(”expected等复合语句或数组初始化的结尾缺少“)”;“(”。

?Case outside of switch case不属于Switch结构,多由于switch结构中的花括号不配对所致。

?Case statement missing ‘:’switch结构中的某个case之后缺少冒号。

?Constant expression required定义数组时指定的数组长度不是常量表达式。

?Declaration syntax error 结构体或联合类型的定义后缺少分号。

?Declaration was expected 缺少说明,通常是因为缺少分界符如逗号、分号、右圆括号等所引起的。

【GCC】gcc警告选项汇总--编辑中gcc编译选项

【GCC】gcc警告选项汇总--编辑中gcc编译选项

【GCC】gcc警告选项汇总--编辑中gcc编译选项⽬录参考原⽂:https:///qq_17308321/article/details/79979514前⾔警告:不是错误的,但是有风险或表明可能有错误。

英⽂原⽂:请求或取消警告选项加上-Wall吧,gcc 默认不加参数的情况下连定义了返回值的函数没有返回值都不报错。

-Wall,-Wextra 就是加-Wall 和-Wall不启动的选项也加上()-fsyntax-only检查代码中的语法错误,但除此之外不要做任何事情。

-w (⼩写)禁⽌所有警告消息。

-W (⼤写)以“ -W ”请求特定的警告 - 可以隐式地请求隐式声明的警告。

-W和-Wall的区别-Wall选项意思是编译后显⽰所有警告。

-W选项类似-Wall,会显⽰警告,但是只显⽰编译器认为会出现错误的警告。

在编译⼀些项⽬的时候可以-W和-Wall选项⼀起使⽤。

gcc -W -Wall test_w_wall testwwall.c-Werror=将指定的警告转换为错误。

请注意,指定-Werror = foo会⾃动隐含-W foo 。

但是, -Wno-error = foo并不意味着什么。

反过来:-Wno-error取消编译选项-Werror⽤途:假设我们使⽤了⼀个⼈的代码A⽬录,⾥⾯有⼀个-Werror的选项,把所有的警告当做错误;⼜使⽤了另⼀个⼈的代码B⽬录,⾥⾯存在⼀堆Warning。

这样,当我们把它们合在⼀起编译的时候,A中的-Werror选项会导致B的代码编译不过。

但我们⼜不想去修改B的代码,怎么办?⽅法是,先add_subdirectory(A),之后,加上⼀句set(CMAK_CXX_FLAGS "${CMAK_CXX_FLAGS} -Wno-error")-Wno-这个前缀,就是⽤来取消⼀个编译选项的然后,再add_subdirectory(B)-Wfatal-errors在发⽣第⼀个错误时中⽌编译。

C语言编译中的常见错误

C语言编译中的常见错误

C语言编译中的常见错误1、警告类错误?‘XXX’declare but never used变量XXX已定义但从未用过。

?‘XXX’is assigned a value which is never used变量XXX已赋值但从未用过。

?Code has no effect 程序中含有没有实际作用的代码。

?Non-portable pointer conversion不适当的指针转换,可能是在应该使用指针的地方用了一个非0的数值。

?Possib le use of ‘XXX’before definition表达式中使用了未赋值的变量?Possibly incorrect assignment这样的赋值可能不正确?Redeclaration of ‘main’一个程序文件中主函数main不止一个。

?Suspicious pointer conversion可疑的指针转换。

通常是使用了基本类型不匹配的指针。

?Unreachable code程序含有不能执行到的代码。

2、错误或致命错误?Compound statement missing } in function main程序结尾缺少括号}。

?“}”expected;“(”expected等复合语句或数组初始化的结尾缺少“)”;“(”。

?Case outside of switch case不属于Switch结构,多由于switch结构中的花括号不配对所致。

?Case statement missing ‘:’switch结构中的某个case之后缺少冒号。

?Constant expression required定义数组时指定的数组长度不是常量表达式。

?Declaration syntax error 结构体或联合类型的定义后缺少分号。

?Declaration was expected 缺少说明,通常是因为缺少分界符如逗号、分号、右圆括号等所引起的。

解密C语言编译过程中的各类warning提示

解密C语言编译过程中的各类warning提示

解密C语言编译过程中的各类warning提示在进行C语言编程时,我们经常会遇到各种warning提示。

这些warning提示是编译器对代码中可能存在的问题进行的警告,虽然不会导致程序无法运行,但是却可能会影响程序的性能、可读性和可维护性。

本文将解密C语言编译过程中的各类warning提示,帮助读者更好地理解和解决这些问题。

1. 未使用的变量在编写代码时,我们可能会定义一些变量但没有使用它们。

这在大型项目中尤为常见,因为代码可能经常被修改和更新。

编译器会发出未使用变量的warning提示,提醒我们检查代码并删除或使用这些变量。

未使用的变量不仅浪费了内存空间,还可能导致其他开发人员产生困惑。

解决方法:可以通过删除未使用的变量或者在代码中使用这些变量来解决这个问题。

如果这些变量是有意保留的,可以使用编译器指令来禁用这个warning提示。

2. 未初始化的变量C语言中,变量必须在使用之前进行初始化。

如果我们在使用变量之前没有对其进行初始化,编译器会发出未初始化变量的warning提示。

未初始化的变量可能会导致程序产生不可预测的行为,因为它们的值是不确定的。

解决方法:在使用变量之前,确保对其进行初始化。

可以通过给变量赋予一个默认值或者在声明变量时进行初始化来解决这个问题。

3. 函数定义与声明不匹配在C语言中,函数的定义和声明必须匹配。

如果函数的定义和声明不一致,编译器会发出函数定义与声明不匹配的warning提示。

这可能是因为函数的参数类型、返回值类型或者参数个数不一致。

解决方法:检查函数的定义和声明,确保它们一致。

可以通过修改函数的参数类型、返回值类型或者参数个数来解决这个问题。

4. 隐式类型转换C语言中,存在隐式类型转换的情况。

当我们将一个较小的数据类型赋值给一个较大的数据类型时,编译器会发出隐式类型转换的warning提示。

隐式类型转换可能导致数据的精度丢失或者产生不可预测的结果。

解决方法:显式地进行类型转换,确保数据类型的一致性。

gcc 警告安全级别

gcc 警告安全级别

gcc 警告安全级别一、-Wall级别下的警告-Wall是GCC中一个常用的警告选项,它会启用大多数的警告信息。

在这个级别下,GCC会对代码中的潜在问题进行提示,开发者可以根据这些警告信息进行代码的优化和改进。

例如,当我们在代码中使用了未声明的变量时,GCC会给出警告信息,提示我们可能存在的问题。

这种警告可以帮助我们发现代码中的潜在错误,并及时修复。

在-Wall级别下,GCC还会对一些常见的编程错误进行提示,比如使用未初始化的变量、函数返回值未使用等。

这些警告信息可以帮助我们提高代码的可靠性和健壮性。

二、-Wextra级别下的警告-Wextra是GCC中的另一个常用的警告选项,它启用了更多的警告信息。

在这个级别下,GCC会对代码中的一些潜在问题进行更加详细的提示。

例如,当我们在代码中使用了不安全的函数时,GCC会给出警告信息,提示我们可能存在的安全风险。

这种警告可以帮助我们避免使用一些已知的不安全函数,从而提高代码的安全性。

在-Wextra级别下,GCC还会对代码中的一些潜在的逻辑错误进行提示。

例如,当我们在条件语句中使用了错误的比较符号时,GCC会给出警告信息,帮助我们发现和修复这些潜在的逻辑错误。

三、-Werror级别下的警告-Werror是GCC中的一个特殊的警告选项,它会将所有的警告信息视为错误,即在编译过程中如果出现了任何警告信息,GCC都会将其视为错误并停止编译。

在使用-Werror选项时,我们需要对代码中的所有警告信息进行仔细的检查和处理,确保代码的质量和可靠性。

这种方式可以帮助我们及时发现和解决代码中的问题,并提高代码的可维护性。

然而,使用-Werror选项也需要谨慎,因为有些警告信息可能并不是真正的问题,而是编译器的一些限制或者特性。

在处理这些警告信息时,我们需要仔细分析,并根据实际情况进行调整。

四、-Wno-<警告类型>选项除了上述提到的几个常用的警告选项外,GCC还提供了一些特定的警告选项,可以根据实际需求进行选择和使用。

gcc报错

gcc报错

个人总结:1. gcc 预处理阶段-E常见错误:No such file or directorygcc -E file.c -o file.i 其中file.i为预处理后的c文件,gcc所做的工作是将头文件的内容迭代包含到i 文件,c文件的代码不变。

此时如果gcc在默认路径没有搜索到c 文件中包含的h文件,则出现错误。

i 文件仍是c文件。

解决办法:增加搜索路径。

2.gcc 编译阶段-S常见错误:变量未声明;expected ";" before ;提供给函数"function-name"的参数太少这一阶段将c文件转为s 汇编文件,会对变量是否声明,“;”是否缺失等进行简单语法检查;但并不对函数是否声明进行检查,即使没有声明第一次使用,函数转换后的汇编为:call function-name 。

解决办法:查看变量的声明是否被包含进c文件,是否头文件未包含,或根本未定义。

语句末加" ; "。

函数声明的参数少于调用时的参数不会出现问题,反过来就不可以。

3.gcc 汇编阶段-c4.gcc 链接阶段常见错误:a) 如:In function ' main': undefined reference to ' funtion-name'Collect2: ld return 1解决办法:不能找到函数的声明,看是否函数声明了,或者相应的头文件有无包含。

b) 如:解决办法:5 Segmentation fault报错Char* string;String = (char*)malloc(sizeof(char)*1000);String="";Strcat(string, "sfasfasf");原因:string="", 使string指针指向另一块地址,不再是malloc申请的地址。

gcc常见的编译警告与错误(按字母顺序排列)备课讲稿

gcc常见的编译警告与错误(按字母顺序排列)备课讲稿

gcc常见的编译警告与错误(按字母顺序排列)备课讲稿g c c常见的编译警告与错误(按字母顺序排列)gcc 常见的编译警告与错误(按字母顺序排列)C语言初学者遇到的最大问题往往是看不懂编译错误,进而不知如何修改程序。

有鉴于此,本附录罗列了用gcc编译程序时经常出现的编译警告与错误。

需要提醒读者的是,出现警告(warning)并不影响目标程序的生成,但出现错误(error)则无法生成目标程序。

为便于读者查阅,下面列出了经常遇到的警告与错误,给出了中英文对照(英文按字典顺序排列),并对部分错误与警告做了必要的解释。

#%s expects \FILENAME\ or …#%s 需要 \FILENAME\ 或…#%s is a deprecated GCC extension#%s 是一个已过时的 GCC 扩展#%s is a GCC extension#%s 是一个 GCC 扩展#~ error:#~ 错误:#~ In file included from %s:%u#~ 在包含自 %s:%u 的文件中#~ internal error:#~ 内部错误:#~ no newline at end of file#~ 文件未以空白行结束#~ warning:#~ 警告:#elif after #else#elif 出现在 #else 后#elif without #if#elif 没有匹配的 #if#else after #else#else 出现在 #else 后#else without #if#else 没有匹配的 #if#endif without #if#endif 没有匹配的 #if#include nested too deeply#include 嵌套过深#include_next in primary source file #include_next 出现在主源文件中#pragma %s %s is already registered #pragma %s %s 已经被注册#pragma %s is already registered#pragma %s 已经被注册#pragma once in main file#pragma once 出现在主文件中#pragma system_header ignored outside include file #pragma system_heade 在包含文件外被忽略%.*s is not a valid universal character%.*s 不是一个有效的 Unicode 字符%s in preprocessing directive预处理指示中出现 %s%s is a block device%s 是一个块设备%s is shorter than expected%s 短于预期%s is too large%s 过大%s with no expression%s 后没有表达式%s: not used because `%.*s’ defined as `%s’ not `%.*s’ %s:未使用因为‘%.*s’被定义为‘%s’而非‘%*.s’%s: not used because `%.*s’ is poisoned%s:未使用因为‘%.*s’已被投毒%s: no t used because `%.*s’ not defined%s:未使用因为‘%.*s’未定义%s: not used because `%s’ is defined%s:未使用因为‘%s’已定义%s: not used because `__COUNTER__’ is invalid%s:未使用因为‘__COUNTER__’无效(\%s\ is an alternative token for \%s\ in C++)(在 C++ 中“%s”会是“%s”的替代标识符)(this will be reported only once per input file)(此警告为每个输入文件只报告一次)\%s\ after # is not a positive integer# 后的“%s”不是一个正整数\%s\ after #line is not a positive integer#line 后的“%s”不是一个正整数\%s\ cannot be used as a macro name as it is an operator in C++ “%s”不能被用作宏名,因为它是 C++ 中的一个操作符\%s\ is not a valid filename“%s”不是一个有效的文件名\%s\ is not defined“%s”未定义\%s\ may not appear in macro parameter list“%s不能出现在宏参数列表中\%s\ re-asserted重断言“%s”\%s\ redefined“%s重定义\/*\ within comment“/*出现在注释中\\x used with no following hex digits\\x 后没有 16 进制数字\defined\ cannot be used as a macro name“defined不能被用作宏名__COUNTER__ expanded inside directive with -fdirectives-only带 -fdirectives-only 时 __COUNTER__ 在指示中扩展__VA_ARGS__ can only appear in the expansion of a C99 variadic macro __VA_ARGS__ 只能出现在 C99 可变参数宏的展开中_Pragma takes a parenthesized string literal_Pragma 需要一个括起的字符串字面常量‘%.*s’ is not in NFC‘%.*s’不在 NFC 中‘%.*s’ is not in NFKC‘%.*s’不在 NFKC 中‘##’ c annot appear at either end of a macro expansion‘##’不能出现在宏展开的两端‘#’ is not followed by a macro parameter‘#’后没有宏参数‘$’ in identifier or number‘$’出现在标识符或数字中‘:’ without preceding ‘?’‘:’前没有‘?’‘?’ without following ‘:’‘?’后没有‘:’'return' with a value, in function returning void在void返回类型的函数中,return返回值。

编译器常见警告与错误信息的解决办法

编译器常见警告与错误信息的解决办法

编译器常见警告与错误信息的解决办法KEIL C编译器常见警告与错误信息的解决办法1. Warning 280:?i?:unreferenced local variable说明局部变量i 在函数中未作任何的存取操作解决方法消除函数中i 变量的宣告2 Warning 206:?Music3?:missing function-prototype说明Music3( )函数未作宣告或未作外部宣告所以无法给其他函数调用解决方法将叙述void Music3(void)写在程序的最前端作宣告如果是其他文件的函数则要写成extern void Music3(void),即作外部宣告3 Compling :C:\8051\MANN.CError:318:can?t open file …beep.h?说明在编译C:\8051\MANN.C 程序过程中由于main.c 用了指令#include “beep.h”,但却找不到所致解决方法编写一个beep.h 的包含档并存入到c:\8051 的工作目录中4 Compling:C:\8051\LED.CError 237:?LedOn?:function already has a body说明LedOn( )函数名称重复定义即有两个以上一样的函数名称解决方法修正其中的一个函数名称使得函数名称都是独立的5 ***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_DELAYX1MS?DELAY 说明DelayX1ms( )函数未被其它函数调用也会占用程序记忆体空间解决方法去掉DelayX1ms( )函数或利用条件编译#if …..#endif,可保留该函数并不编译6 ***WARNING 6 :XDATA SPACE MEMORY OVERLAPFROM : 0025HTO: 0025H说明外部资料ROM 的0025H 重复定义地址解决方法外部资料ROM 的定义如下Pdata unsigned char XFR_ADC _at_0x25 其中XFR_ADC 变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25 处并修正它7 WARNING 206:?DelayX1ms?: missing function-prototypeC:\8051\INPUT.CError 267 :?DelayX1ms …:requires ANSI-style prototype C:\8051\INPUT.C说明程序中有调用DelayX1ms 函数但该函数没定义即未编写程序内容或函数已定义但未作宣告解决方法编写DelayX1ms 的内容编写完后也要作宣告或作外部宣告可在delay.h的包含档宣告成外部以便其它函数调用8 ***WARNING 1:UNRESOLVED EXTERNAL SYMBOLSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)***WARNING 2:REFERENCE MADE TO UNRESOLVED EXTERNALSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)ADDRESS:0018H说明程序中有调用MUSIC 函数但未将该函数的含扩档C 加入到工程档Prj 作编译和连接解决方法设MUSIC3 函数在MUSIC C 里将MUSIC C 添加到工程文件中去9 ***ERROR 107:ADDESS SPACE OVERFLOWSPACE: DATASEGMENT: _DATA_GOUP_LENGTH: 0018H***ERROR 118: REFERENCE MADE TO ERRONEOUS EXTERNALSYMBOL: VOLUMEMODULE: C:\8051\OSDM.OBJ (OSDM)ADDRESS: 4036H说明data 存储空间的地址范围为0~0x7f,当公用变量数目和函数里的局部变量如果存储模式设为SMALL 则局部变量先使用工作寄存器R2~R7 作暂存当存储器不够用时则会以data 型别的空间作暂存的个数超过0x7f 时就会出现地址不够的现象解决方法将以data 型别定义的公共变量修改为idata 型别的定义--------------------------------------------------------------------------------------------------keil c编译器错误与解决方法2008-05-27 20:191. Warning 280:?i?:unreferenced local variable说明局部变量i 在函数中未作任何的存取操作解决方法消除函数中i 变量的宣告2 Warning 206:?Music3?:missing function-prototype说明Music3( )函数未作宣告或未作外部宣告所以无法给其他函数调用解决方法将叙述void Music3(void)写在程序的最前端作宣告如果是其他文件的函数则要写成extern void Music3(void),即作外部宣告3 Compling :C:\8051\MANN.CError:318:can?t open file …beep.h?说明在编译C:\8051\MANN.C 程序过程中由于main.c 用了指令#i nclude “beep.h”,但却找不到所致解决方法编写一个beep.h 的包含档并存入到c:\8051 的工作目录中4 Compling:C:\8051\LED.CError 237:?LedOn?:function already has a body说明LedOn( )函数名称重复定义即有两个以上一样的函数名称解决方法修正其中的一个函数名称使得函数名称都是独立的5 ***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_DELAYX1MS?DELAY 说明DelayX1ms( )函数未被其它函数调用也会占用程序记忆体空间解决方法去掉DelayX1ms( )函数或利用条件编译#if …..#endif,可保留该函数并不编译6 ***WARNING 6 :XDATA SPACE MEMORY OVERLAPFROM : 0025HTO: 0025H说明外部资料ROM 的0025H 重复定义地址解决方法外部资料ROM 的定义如下Pdata unsigned char XFR_ADC _at_0x25 其中XFR_ADC 变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25 处并修正它7 WARNING 206:?DelayX1ms?: missing function-prototypeC:\8051\INPUT.CErro r 267 :?DelayX1ms …:requires ANSI-style prototype C:\8051\INPUT.C说明程序中有调用DelayX1ms 函数但该函数没定义即未编写程序内容或函数已定义但未作宣告解决方法编写DelayX1ms 的内容编写完后也要作宣告或作外部宣告可在delay.h 的包含档宣告成外部以便其它函数调用8 ***WARNING 1:UNRESOLVED EXTERNAL SYMBOLSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)***WARNING 2:REFERENCE MADE TO UNRESOLVED EXTERNALSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)ADDRESS:0018H说明程序中有调用MUSIC 函数但未将该函数的含扩档C 加入到工程档Prj 作编译和连接解决方法设MUSIC3 函数在MUSIC C 里将MUSIC C 添加到工程文件中去9 ***ERROR 107:ADDESS SPACE OVERFLOWSPACE: DATASEGMENT: _DATA_GOUP_LENGTH: 0018H***ERROR 118: REFERENCE MADE TO ERRONEOUS EXTERNALSYMBOL: VOLUMEMODULE: C:\8051\OSDM.OBJ (OSDM)ADDRESS: 4036H说明data 存储空间的地址范围为0~0x7f,当公用变量数目和函数里的局部变量如果存储模式设为SMALL 则局部变量先使用工作寄存器R2~R7 作暂存当存储器不够用时则会以data 型别的空间作暂存的个数超过0x7f 时就会出现地址不够的现象解决方法将以data 型别定义的公共变量修改为idata 型别的定义说明如对编译出错感兴趣的网友能否把你们常遇到的错误信息收集起来并提出最终的解决办法加以归纳以期共享10.***WARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?PR?_WRITE_GMVLX1_REG?D_GMVLX1CALLER1: ?PR?VSYNC_INTERRUPT?MAINCALLER2: ?C_C51STARTUP***WARNING L15: MULTIPLE C ALL TO SEGMENTSEGMENT: ?PR?_SPI_SEND_WORD?D_SPICALLER1: ?PR?VSYNC_INTERRUPT?MAINCALLER2: ?C_C51STARTUP***WARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?PR?SPI_RECEIVE_WORD?D_SPICALLER1: ?PR?VSYNC_INTERRUPT?MAINCALLER2: ?C_C51STARTUP该警告表示连接器发现有一个函数可能会被主函数和一个中断服务程序(或者调用中断服务程序的函数)同时调用,或者同时被多个中断服务程序调用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

g c c常见的编译警告与错误(按字母顺序排列)gcc 常见的编译警告与错误(按字母顺序排列)C语言初学者遇到的最大问题往往是看不懂编译错误,进而不知如何修改程序。

有鉴于此,本附录罗列了用gcc编译程序时经常出现的编译警告与错误。

需要提醒读者的是,出现警告(warning)并不影响目标程序的生成,但出现错误(error)则无法生成目标程序。

为便于读者查阅,下面列出了经常遇到的警告与错误,给出了中英文对照(英文按字典顺序排列),并对部分错误与警告做了必要的解释。

#%s expects \FILENAME\ or …#%s 需要 \FILENAME\ 或…#%s is a deprecated GCC extension#%s 是一个已过时的 GCC 扩展#%s is a GCC extension#%s 是一个 GCC 扩展#~ error:#~ 错误:#~ In file included from %s:%u#~ 在包含自 %s:%u 的文件中#~ internal error:#~ 内部错误:#~ no newline at end of file#~ 文件未以空白行结束#~ warning:#~ 警告:#elif after #else#elif 出现在 #else 后#elif without #if#elif 没有匹配的 #if#else after #else#else 出现在 #else 后#else without #if#else 没有匹配的 #if#endif without #if#endif 没有匹配的 #if#include nested too deeply#include 嵌套过深#include_next in primary source file #include_next 出现在主源文件中#pragma %s %s is already registered #pragma %s %s 已经被注册#pragma %s is already registered#pragma %s 已经被注册#pragma once in main file#pragma once 出现在主文件中#pragma system_header ignored outside include file #pragma system_heade 在包含文件外被忽略%.*s is not a valid universal character%.*s 不是一个有效的 Unicode 字符%s in preprocessing directive预处理指示中出现 %s%s is a block device%s 是一个块设备%s is shorter than expected%s 短于预期%s is too large%s 过大%s with no expression%s 后没有表达式%s: not used because `%.*s’ defined as `%s’ not `%.*s’ %s:未使用因为‘%.*s’被定义为‘%s’而非‘%*.s’%s: not used because `%.*s’ is poisoned%s:未使用因为‘%.*s’已被投毒%s: no t used because `%.*s’ not defined%s:未使用因为‘%.*s’未定义%s: not used because `%s’ is defined%s:未使用因为‘%s’已定义%s: not used because `__COUNTER__’ is invalid%s:未使用因为‘__COUNTER__’无效(\%s\ is an alternative token for \%s\ in C++)(在 C++ 中“%s”会是“%s”的替代标识符)(this will be reported only once per input file)(此警告为每个输入文件只报告一次)\%s\ after # is not a positive integer# 后的“%s”不是一个正整数\%s\ after #line is not a positive integer#line 后的“%s”不是一个正整数\%s\ cannot be used as a macro name as it is an operator in C++ “%s”不能被用作宏名,因为它是 C++ 中的一个操作符\%s\ is not a valid filename“%s”不是一个有效的文件名\%s\ is not defined“%s”未定义\%s\ may not appear in macro parameter list“%s不能出现在宏参数列表中\%s\ re-asserted重断言“%s”\%s\ redefined“%s重定义\/*\ within comment“/*出现在注释中\\x used with no following hex digits\\x 后没有 16 进制数字\defined\ cannot be used as a macro name“defined不能被用作宏名__COUNTER__ expanded inside directive with -fdirectives-only带 -fdirectives-only 时 __COUNTER__ 在指示中扩展__VA_ARGS__ can only appear in the expansion of a C99 variadic macro __VA_ARGS__ 只能出现在 C99 可变参数宏的展开中_Pragma takes a parenthesized string literal_Pragma 需要一个括起的字符串字面常量‘%.*s’ is not in NFC‘%.*s’不在 NFC 中‘%.*s’ is not in NFKC‘%.*s’不在 NFKC 中‘##’ c annot appear at either end of a macro expansion‘##’不能出现在宏展开的两端‘#’ is not followed by a macro parameter‘#’后没有宏参数‘$’ in identifier or number‘$’出现在标识符或数字中‘:’ without preceding ‘?’‘:’前没有‘?’‘?’ without following ‘:’‘?’后没有‘:’'return' with a value, in function returning void在void返回类型的函数中,return返回值。

"protocol_type" redefinedprotocol_type重定义anonymous variadic macros were introduced in C99匿名可变参数宏在 C99 中被引入assertion without predicate断言后没有谓词assertions are a deprecated extension断言是一个已过时的 GCC 扩展assertions are a GCC extension断言是一个 GCC 扩展assignment discards qualifiers from pointer target type 赋值时,取消了右值的限定。

assignment from incompatible pointer type不兼容的指针间赋值attempt to use poisoned \%s\试图使用有毒的“%s”backslash and newline separated by space反斜杠和换行为空格所分隔backslash-newline at end of file反斜杠续行出现在文件末尾binary constants are a GCC extension二进制常量是一个 GCC 扩展C++ style comments are not allowed in ISO C90C++ 风格的注释在 ISO C90 中不被允许cannot find source file %s找不到源文件 %sCharacter %x might not be NFKC字符 %x 可能不是 NFKCcharacter 0x%lx is not in the basic source character set\n 字符 0x%lx 不在基本源字符集中\ncharacter 0x%lx is not unibyte in execution character set 字符 0x%lx 在执行字符集中不是单字节的character constant too long for its type字符常量大小超出其类型comma operator in operand of #if#if 操作数中出现逗号comparison between pointer and integerinteger与pointer比较comparison is always false due to limited range of data type 由于数据类型范围的限制,比较结果一直为假comparison is always true due to limited range of data type 由于数据类型范围的限制,比较结果一直为真。

conversion from %s to %s not supported by iconviconv 不支持从 %s 到 %s 的转换converting escape sequence to execution character set将转义序列转换到执行字符集converting to execution character set转换到可执行文件的字符集converting UCN to execution character set将 UCN 转换到执行字符集converting UCN to source character set将 UCN 转换到源字符集could not determine date and time无法决定日期与时间could not determine file timestamp无法决定文件的时间戳CPP arithmetic must be at least as precise as a target intCPP 算术必须至少具有目标 int 的精度CPP half-integer narrower than CPP characterCPP 半整数短于 CPP 字符CPP on this host cannot handle wide character constants over %lu bits, but the target requires %lu bits在此宿主机上,CPP 不能处理长于 %lu 位的宽字符常量,但目标需要 %lu 位cppchar_t must be an unsigned typecppchar_t 必须是无符号型current file is older than %s当前文件早于 %sdecimal float constants are a GCC extension十进制浮点常量是一个 GCC 扩展detected recursion whilst expanding macro \%s\展开宏%s时检测到递归division by zero in #if#if 中用零做除数duplicate macro parameter \%s\重复的宏参数“%s”embedding a directive within macro arguments is not portable将一个指示嵌入宏参数中是不可移植的empty character constant空的字符常量empty filename in #%s#%s 中文件名为空expected expression before 'else'else之前无表达式exponent has no digits指数部分没有数字extra tokens at end of #%s directive#%s 指示的末尾有多余的标识符failure to convert %s to %s无法从 %s 转换到 %sfixed-point constants are a GCC extension定点常量是一个 GCC 扩展floating constant in preprocessor expression浮点常量出现在预处理表达式中function-like macro \%s\ must be used with arguments in traditional C 类似函数的宏“%s”在传统 C 中必须与参数一起使用hex escape sequence out of range16 进制转义序列越界hexadecimal floating constants require an exponent16 进制浮点常量需要指数部分identifier \%s\ is a special operator name in C++标识符“%s”是 C++ 中的一个特殊操作符imaginary constants are a GCC extension虚数常量是一个 GCC 扩展imaginary number in preprocessor expression预处理表达式中出现虚数impossible operator ‘%u’不可能的操作‘%u’In _cpp_valid_ucn but not a UCN在 _cpp_valid_ucn 中但不是一个 UCNincompatible implicit declaration of built-in function 'printf' 与内置的printf函数隐式声明不兼容。

相关文档
最新文档