常见gcc编译警告
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(GNU Compiler Collection)是一款开源的编译器,用于将源代码编译成可执行文件。
在使用GCC编译代码时,可能会遇到各种警告信息,这些警告信息可以帮助我们发现代码中的潜在问题。
下面是一个关于GCC警告信息的800字左右的说明手册:一、概述GCC在编译过程中会输出警告信息,这些信息通常用于指出代码中可能存在的问题,如未使用的变量、未初始化的变量、潜在的类型不匹配等。
正确理解和处理这些警告信息可以帮助我们提高代码质量,减少潜在的错误和缺陷。
二、常见警告类型1.未使用的变量:当一个变量在定义后从未被使用时,GCC会发出这种警告。
这可能是由于变量名拼写错误、逻辑错误或者变量定义多余。
2.未初始化的变量:当一个变量在使用前未被初始化时,GCC会发出这种警告。
未初始化的变量可能导致不确定的行为,因此应该避免使用未初始化的变量。
3.潜在的类型不匹配:当一个变量的类型与其被赋予的值不匹配时,GCC会发出这种警告。
这可能是由于类型转换错误、函数返回值类型不匹配等原因引起的。
4.函数未声明:当一个函数在调用前未被声明时,GCC 会发出这种警告。
应该确保所有调用的函数都已在调用前声明或定义。
5.数组越界:当数组下标越界时,GCC会发出这种警告。
这可能是由于数组下标计算错误或者逻辑错误引起的。
6.除以零:当一个整数被零除时,GCC会发出这种警告。
应该避免整数被零除的情况。
7.丢失符号:当链接器找不到某个符号(如函数或变量)的定义时,GCC会发出这种警告。
这可能是由于编译选项错误、遗漏了某个源文件等原因引起的。
三、处理警告的方法1.检查代码逻辑:对于未使用的变量和未初始化的变量等警告,需要检查代码逻辑是否正确,确保每个变量都有正确的用途和初始化。
2.类型转换:对于潜在的类型不匹配等警告,可以使用类型转换来确保数据类型匹配。
3.函数声明:对于函数未声明等警告,需要确保所有调用的函数都已在调用前声明或定义。
常见gcc编译警告整理以及解决方法【收藏】

常见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 a backslash/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 and g 分别是gnu的c & c 编译器gcc/g 在执行编译工作的时候,总共需要4步1.预处理,生成.i的文件预处理器cpp2.将预处理后的文件不转换成汇编语言,生成文件.s编译器egcs3.有汇编变为目标代码(机器代码)生成.o的文件汇编器as4.连接目标代码,生成可执行程序连接器ld1.总体选项-E只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面.例子用法:gcc -E hello.c > pianoapan.txtgcc -E hello.c | more慢慢看吧,一个hello word 也要与处理成800行的代码-S只激活预处理和编译,就是指把文件编译成为汇编代码。
例子用法gcc -S hello.c他将生成.s的汇编代码,你可以用文本编辑器察看-c只激活预处理,编译,和汇编,也就是他只把程序做成obj文件例子用法:gcc -c hello.c他将生成.o的obj文件2.目录选项-Idir在你是用#include'file'的时候,gcc/g 会先在当前目录查找你所制定的头文件,如果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他回先在你所制定的目录查找,然后再按常规的顺序去找.对于#include,gcc/g 会到-I制定的目录查找,查找不到,然后将到系统的缺省的头文件目录查找-include file-i相当于“#include”包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以用它设定,功能就相当于在代码中使用#include例子用法:gcc hello.c -include /root/pianopan.h-I-就是取消前一个参数的功能,所以一般在-Idir之后使用-idirafter dir在-I的目录里面查找失败,讲到这个目录里面查找.-iprefix prefix-iwithprefix dir一般一起使用,当-I的目录查找失败,会到prefix dir下查找-Ldir制定编译的时候,搜索库的路径。
对于GCC警告选项的理解

dereferencing type-punned pointer will break strict-aliasing rules 警告信息跟 优化选项-fstrict-aliasing 有关。当开启这个优化选项时,可能优化会导致源 代码中部分语句缺失,而造成系统工作不正常,所以就所有的违反 strictaliasing rules 原则的地方加了条这个警告信息,提醒读者检查这个地方的代 码,看看是不是如果优化后会导致部分语句工作不正常 同时这个信息提示还有另外一个目的,两个不同类型的指针指向同一个地 址时,极有可能会导致代码编写出错(比如犯大小端的错误,还有地址字节对 齐的错误),所以这个警告信息还有这一层的目的。
3 ../SRC/libpjmacl/pjmacl_pjm.c:2867: 警告: no previous declaration for pjmacl_get_node_pri_U pjmacl_get_node_pri_U 如果为外部函数的话,就应该有个声明加到类似 pjsd_prt.h 中 4 ../SRC/libpjmfep/pjmfep_exec.c:406: 警告: implicit declaration of function pj/libpjmfep/pjmfep_exec.c:406: 警告: nested extern declaration of pjmfep_evc_queue_init pjmfep_evc_queue_init 函数就没有被声明过,而且如果定义文件和引用该 函数文件不一样时,引用该函数的文件也没有提前用 extern 声明该函数 5 ../SRC/pjmd/pjmd_conff.c:1053: 警告: passing argument 1 of set_rscGrpNode_type4 discards qualifiers from pointer target type
gcc和g++常用编译参数

gcc和g++常⽤编译参数-w -W -Wall -w 关闭编译警告。
平时编写c/c++代码如果不规范,编译的时候会抛出很多警告。
但是⼀般的警告都是可以忽略的,⽐如类型转换。
编译的时候可以加-w关闭警告 -W 也是关闭编译警告,但是⽐-w智能⼀些,它只会显⽰编辑器认为会出错的警告 -Wall, 显⽰所有警告。
⽐如下⾯的代码,test.c gcc -o a.out test.c -Wall, 把所有的警告都显⽰出来了,没有使⽤的变量i,在void函数返回了double。
gcc -o a.out test.c -W,只显⽰了编译器认为会出错的警告,没有使⽤变量i的那个警告编译器认为不会出错,所以没有输出。
gcc -o a.out test.c -w,屏蔽了所有警告,只输出错误-g -g3 gcc ⽀持4中级别的调试信息,-g0表⽰不⽣成调试信息,-g3表⽰⽣成最多的调试信息。
-g默认为-g2。
⼀般的调试信息包括⾏号,函数,外部变量。
-g3包含其他额外的调试信息,⽐如宏定义。
-O1 -O2 -O3 -Os -O系列选项主要⽤于优化代码。
-O和-O1是等价的,不影响编译速度,并且会采⽤⼀些优化算法,降低代码⼤⼩并提⾼代码运⾏速度。
-O2,会降低编译速度,但是除了包含-O1的优化算法之外,还会采⽤⼀些其他的优化算法来提⾼代码运⾏速度。
-O3,除了包含-O2所有的优化外,会采取⼀些向量化算法,提⾼代码的并⾏执⾏程度,使之更充分地利⽤现代cpu的流⽔线和cache。
-Os,-O3即使是增加代码的⼤⼩,也要提⾼运⾏速度。
⽽这个选项在-O2的基础上,尽量减少⽬标的⼤⼩,这个经常⽤于存储量⽐较⼩的设备。
-fno-strict-aliasing 当优化级别在-O2即以上时,strict-aliasing会被采⽤。
编译器会假设代码中没有强制转换,从⽽会使⽤更加激进的优化算法对代码进⾏优化。
也就是说,代码中如果存在类似于下⾯的代码就会出错: int num = 1.0; double *p = (int *)(&num); 所以当优化级别在-O2及以上时,应该使⽤-fno-strict-aliasing关闭strict-aliasing。
gcc常见的编译警告与错误(按字母顺序排列)

gcc 常见的编译警告与错误〔按字母顺序排列〕C语言初学者遇到的最大问题往往是看不懂编译错误,进而不知如何修改程序。
有鉴于此,本附录罗列了用gcc编译程序时经常出现的编译警告与错误。
需要提醒读者的是,出现警告〔warning〕并不影响目标程序的生成,但出现错误〔error〕则无法生成目标程序。
为便于读者查阅,下面列出了经常遇到的警告与错误,给出了中英文对照〔英文按字典顺序排列〕,并对局部错误与警告做了必要的解释。
*%s e*pects \FILENAME\ or …*%s 需要\FILENAME\ 或…*%s is a deprecated GCC e*tension*%s 是一个已过时的GCC 扩展*%s is a GCC e*tension*%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_ne*t in primary source file*include_ne*t 出现在主源文件中*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 e*pected%s 短于预期%s is too large%s 过大%s with no e*pression%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: not 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 ment"/*出现在注释中\\* used with no following he* digits\\* 后没有16 进制数字\defined\ cannot be used as a macro name"defined不能被用作宏名__COUNTER__ e*panded inside directive with -fdirectives-only带-fdirectives-only 时__COUNTER__ 在指示中扩展__VA_ARGS__ can only appear in the e*pansion 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 中‘**’ cannot appear at either end of a macro e*pansion‘**’不能出现在宏展开的两端‘*’ 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返回值。
如何解决C语言中的编译错误与警告

如何解决C语言中的编译错误与警告C语言是一种广泛应用于系统编程和嵌入式开发的编程语言,它的编译过程中常常会出现各种错误和警告。
这些错误和警告可能会导致程序无法正确编译或者在运行时出现问题。
因此,解决C语言中的编译错误与警告是每个程序员都需要掌握的重要技能。
本文将介绍一些常见的编译错误和警告,并提供一些解决方法。
一、理解编译错误和警告的含义在解决编译错误和警告之前,我们首先需要理解它们的含义。
编译错误是指在编译过程中发现的语法错误或者逻辑错误,这些错误会导致程序无法正确编译。
编译警告是指在编译过程中发现的一些潜在的问题,虽然不会导致程序无法编译,但可能会导致程序在运行时出现问题。
二、常见的编译错误和警告1. 语法错误:语法错误是最常见的编译错误之一,它通常是由于编程人员在编写代码时遗漏了分号、括号不匹配等导致的。
解决语法错误的方法是仔细检查代码,确保语法正确。
2. 未声明的标识符:当使用一个未声明的标识符时,编译器会报错。
解决这个问题的方法是在使用标识符之前先进行声明或者引入相应的头文件。
3. 类型不匹配:类型不匹配是指在赋值或者函数调用过程中,变量的类型与期望的类型不一致。
解决这个问题的方法是检查变量的类型,并进行相应的类型转换。
4. 未使用的变量:编译器会对未使用的变量发出警告,这可能是由于代码中存在一些无用的变量。
解决这个问题的方法是删除未使用的变量或者对其进行使用。
5. 未初始化的变量:未初始化的变量可能导致程序在运行时出现未定义的行为。
解决这个问题的方法是在使用变量之前先进行初始化。
6. 函数返回值不匹配:函数的返回值类型与函数定义时声明的返回值类型不一致会导致编译错误。
解决这个问题的方法是检查函数的返回值类型,并进行相应的修改。
7. 潜在的内存泄漏:编译器可能会对未释放的内存发出警告,这可能会导致内存泄漏。
解决这个问题的方法是在使用完内存后及时释放。
三、解决编译错误和警告的方法1. 仔细阅读编译错误和警告信息:编译器通常会提供详细的错误和警告信息,我们应该仔细阅读这些信息,找出问题所在。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 a
backslash/newline sequence.
c/c++代码的每一行后面有一个“结束符”,也就是newline。
避免当被include的文件展开后,前一个文件的最后一行与后一个文件的第一行直接被连接成一行从而造成错误。
2、warning: comparison between pointer and integer
解释:integer与pointer比较
3、 warning: assignment discards qualifiers from pointer target type
解释:赋值时,取消了右值的限定。
4、 warning: passing argument 1 of 'send' makes pointer from integer without a cast
解释:函数send的第一个integer型参数没有强制转换为pointer型
5、warning: comparison is always true due to limited range of data type
解释:由于数据类型范围的限制,比较结果一直为真。
6、warning: initialization from incompatible pointer type
解释:不兼容指针类型的初始化
7、 warning: return makes pointer from integer without a cast
解释:return使integer转换为pointer,没有加强制类型转换。
8、warning: incompatible implicit declaration of built-in function 'printf'
解释:与内置的printf函数隐士声明不兼容。
9、warning: initialization discards qualifiers from pointer target type
解释:initialization取消了指针目标类型的限定。
10、warning: comparison is always false due to limited range of data type
由于类型限制,比较一直是假
11、warning: assignment from incompatible pointer type
不兼容的指针间赋值
12、warning: passing argument 1 of 'mes_read_time' discards qualifiers from pointer target type12、mes_函数第一个参数的传递,丢弃了指针目标类型限定。
13、warning: "protocol_type" redefined
——type重定义
14、warning: 'return' with a value, in function returning void
在void返回类型的函数中,return返回值。