请教gcc编译下的几个警告该怎么gcc 去除警告

当前位置:&&技术问答>
warning:no newline at end of file 在gcc编译中如果.c或者.h文件没有以新行结尾,则会有这样的警告呢,没有以新行结尾会有这么问题吗
&&&&来源:&互联网& 发布时间:
&&&&本文导语:&
没问题,多看几次警告而已。
回车换行符在unix和windows中是不同的
Windows :rn
程序在unix下不用加空行的,在windows下要加空行。不过还是建议都空上一行。
所以当你...
没问题,多看几次警告而已。
回车换行符在unix和windows中是不同的
Windows :rn
程序在unix下不用加空行的,在windows下要加空行。不过还是建议都空上一行。
所以当你在Windows下编辑的最后一个字符是r不是n,编译器以为有错误。
不用管它!!只是警告而已!
确实是这样的,不过我也不知道为什么要这么设计编译器,觉得挺奇怪的。
您可能感兴趣的文章:
本站()旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。本站()站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
相关文章推荐
特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!
(C)2012-,E-mail:www_169it_(请将#改为@)3575人阅读
编译器(13)
你可以使用'-W'开始的选项来请求许多特定的警告,例如-Wimplicit要求对隐式声明发出警告。所有这些特定的警告选项也有一个以“-Wno-“开头的否定形式来关闭警告;例如︰-Wno-explicit。
You can request many specific warnings with options beginning with ‘-W’, for example -Wimplicit to request warnings on implicit declarations. Each of these specific warning options also has a negative form beginning ‘-Wno-’
for example,
-Wno-implicit. This manual lists only one of the two forms, whichever is not the default. For further language-specific options also refer to C++ Dialect Options and Objective-C and Objective-C++ Dialect Options. &
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1913862次
积分:24701
积分:24701
排名:第235名
原创:432篇
转载:1009篇
译文:146篇
评论:78条
(24)(19)(20)(10)(22)(51)(22)(1)(1)(17)(9)(11)(65)(8)(29)(27)(1)(6)(32)(57)(29)(8)(3)(37)(89)(109)(51)(165)(92)(105)(220)(171)(34)(6)(19)(4)(1)(8)(6)(1)(1)为什么Linux内核代码质量管理,容忍内核编译过程中使用默认编译选项时,编译器(gcc)警告的海量Warning? - 知乎29被浏览2957分享邀请回答55 条评论分享收藏感谢收起1添加评论分享收藏感谢收起更多与世界分享知识、经验和见解1917人阅读
程序编程(12)
GCC有很多的编译选项,警告选项;指定头文件、库路径;优化选项。本文针整理一下GCC的警告选项,主要依据http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html文档,并加上自己的一点小小经验。
禁止编译警告的打印。这个警告不建议使用。大约2012年底,公司代码进行一次大重构,另外从Codeblock集成开发环境转向Makefile管理,Makefile里面默认使用了-w,因而代码一直没有警告,今年个别项目开发中发现一些代码笔误导致的BUG,而这些问题可以从编译警告中知道。前几个月,领导安排我来fix这些警告。为了自己,为了后人,不建议使用-w选项。
将所有的警告当成错误处理。此选项谨慎建议加上。有的开源库警告很多(大名鼎鼎的ffmpeg也有很多警告呢),一一改掉耗时耗人力,必要性也不大。最后,公司代码加入了一个开源库,里面有很多代码警告,可能领导又安排我来fix了。
-Wfatal-errors
遇到第一个错误就停止,减少查找错误时间。建议加上。很多人遇到错误,没有意识到从第一个开始排查。不管是编译错误,还是程序运行出错,从最开始的错误查起,是个好的做法。
-Wall开启“所有”的警告。强烈建议加上,并推荐该选项成为共识。如case语句没有default处理,有符号、无符号处理,未使用变量(特别是函数有大量未使用的数组,占用栈空间,测试发现,开辟一个未使用的8MB的数组,程序有coredump),用%d来打印地址,或%s打印int值,等,都可以发出警告。
除-Wall外其它的警告。建议加上。
在GCC编译时,加上必要的警告选项,可以避免很多低级错误引发的问题,我就在实际工程代码中遇到用“==”来赋值,我自己写的代码也出现过把“=”当成判断的。但是,有些错误却不是用GCC选项能解决的。比如一般项目都会自定义调试信息打印函数,但在处理可变参数类型时,往往不注意。可参考文章《一个可变参数类型检查的示例》。
上面只是大概讲几个重要的选项。由于GCC的警告选项太多了,下面尽自己能力写一下。
-Wall选项,顾名思义,就是“所有”的意思,它包括:
-Wall包括:
-Warray-bounds=1 (only with -O2)
-Wc++11-compat
-Wc++14-compat
-Wchar-subscripts
-Wenum-compare (in C/ObjC; this is on by default in C++)
-Wimplicit-int (C and Objective-C only)
-Wimplicit-function-declaration (C and Objective-C only)
-Wbool-compare
-Wduplicated-cond
-Wmain (only for C/ObjC and unless -ffreestanding)
-Wmaybe-uninitialized
-Wmissing-braces (only for C/ObjC)
-Wopenmp-simd
-Wparentheses
-Wpointer-sign
-Wreturn-type
-Wsequence-point
-Wsign-compare (only in C++)
-Wstrict-aliasing
-Wstrict-overflow=1
-Wtautological-compare
-Wtrigraphs
-Wuninitialized
-Wunknown-pragmas
-Wunused-function
-Wunused-label
-Wunused-value
-Wunused-variable
-Wvolatile-register-var 但不要被它的表面意思迷惑,要不,怎么还会有-Wextra呢。-Wextra包括(有几个选项重复了,不懂原因):
-Wclobbered
-Wempty-body
-Wignored-qualifiers
-Wmissing-field-initializers
-Wmissing-parameter-type (C only)
-Wold-style-declaration (C only)
-Woverride-init
-Wsign-compare
-Wtype-limits
-Wuninitialized
-Wshift-negative-value
-Wunused-parameter (only with -Wunused or -Wall)
-Wunused-but-set-parameter (only with -Wunused or -Wall)
-Wchar-subscripts:
使用char类作为数组下标(因为char可能是有符号数)
-Wcomment:
注释使用不规范。如“/* */”注释中还包括“/*”。我在项目源码发现过,不止一处。
-Wmissing-braces
括号不匹配。在多维数组的初始化或赋值中经常出现。下面a没有完整被初始化,b完整初始化:
int a[2][2] = { 0, 1, 2, 3 };
int b[2][2] = { { 0, 1 }, { 2, 3 } };
-Wparentheses
括号不匹配,在运算符操作或if分支语句中,可能会出现此警告。
如“a&&b||c^d”会出现警告。下面代码片段也会有警告
& & foo ();
& bar (); // 这个else实际是if (b)的分支,不是if (a),因此,要用括号来表明其属于哪个分支
这类bug隐藏得深,建议显式地加上括号。
-Wsequence-point
如出现i=i++这类代码,则报警告。-Wall默认有该警告
-Wswitch-defaultcase
没有default时,报警告
-Wunused-but-set-parameter
设置了但未使用的参数警告
-Wunused-but-set-variable
设置了但未使用的变量警告
-Wunused-function&
声明但未使用函数
-Wunused-label
未使用的标签,比如用goto会使用label,但在删除goto语句时,忘了删除label。
-Wunused-variable
未使用的变量
-Wmaybe-uninitialized
变量可能没有被初始化。特别是在有if语句或switch语句中,最好在声明变量时加上初始化。
下面代码片段中,当y不是1、2、3时,x没有明确的值,是不安全的。
switch (y)
& case 1: x = 1;
& case 2: x = 4;
& case 3: x = 5;
-Wfloat-equal
对浮点数使用等号,这是不安全的。
float d = 2.0;
if (d == i)
-Wreturn-type
函数有返回值,但函数体个别地方没有返回值(特别是有if判断,可能忘记在else添加返回值)。
&// no return here
-Wpointer-sign
指针有符号和无符号的错误传参。如函数使用unsigned char*,但传入char*指针。
-Wsign-compare
有符号和无符号比较。
-Wconversion-null
-Wsizeof-pointer-memaccess
在sizeof中经常出现,下面代码片段中,this为指针,4字节,无法保证完整初始化类。
memset(this, 0, sizeof(this));
C++出现,构造函数中成员变量初始化与声明的顺序不一致。
-Woverflow
范围溢出。
局部变量覆盖参数、全局变量,报警告
参考资料:
http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:388841次
积分:7560
积分:7560
排名:第2687名
原创:365篇
评论:157条
感谢曾经帮助过我的朋友!
让我在黑暗到看到一线曙光;
在寒冷中感到一丝温暖。
愿你们健康快乐!万事顺利!
老大、木木、小桂子、小郭、小蟹、老尧,识得你们是莫大的荣幸!
阅读:11734
文章:14篇
阅读:7388
阅读:12653
文章:19篇
阅读:11008
(4)(1)(1)(1)(1)(7)(7)(4)(12)(6)(6)(5)(6)(4)(8)(12)(7)(7)(7)(3)(6)(9)(19)(6)(6)(7)(6)(7)(8)(9)(5)(7)(5)(4)(2)(3)(4)(3)(1)(4)(11)(4)(5)(4)(2)(2)(1)(1)(5)(1)(4)(3)(2)(2)(1)(2)(2)(9)(1)(3)(3)(9)(9)(15)(1)(11)(14)(9)(1)(1)(1)(5)一般在编译代码时会有相当多的警告信息,尤其当我们使用了-Wall选项的时候.-Wall绝不是像其字面意思一样打开所有警告.不过它打开的警告也相当多了.对于一些我们已知&无害&但仍然打印出来挤占可怜的控制台空间的警告,我们当然可以将其&屏蔽&掉.
一般在编译代码时会有相当多的警告信息,尤其当我们使用了-Wall选项的时候.-Wall绝不是像其字面意思一样打开所有警告.不过它打开的警告也相当多了.对于一些我们已知"无害"但仍然打印出来挤占可怜的控制台空间的警告,我们当然可以将其"屏蔽"掉.
就拿以下代码来说:
#include &stdio.h&
#include &stdlib.h&
#include &stdbool.h&
#include &unistd.h&
int main(void)
long double ld = L;
puts("hello world!???(y/n)");
printf("long double type size is %lu %lu\n",sizeof(long double),sizeof ld);
其会生成一个所谓的"三字符组符号"使用的警告,假设这正是我们需要的效果,所以我们可以忽略该警告.我们编译一下看看先(无论用gcc还是clang):
wisy@wisy-ThinkPad-X61:~/src/c_src$ gcc -Wall -std=c11 -O3 -g0 -s -o x x.c
x.c: In function ‘main’:
x.c:9:21: warning: trigraph ??( converted to [ [-Wtrigraphs]
puts("hello world!???(y/n)");
wisy@wisy-ThinkPad-X61:~/src/c_src$ clang -Wall -std=c11 -O3 -g0 -s -o x x.c
x.c:9:21: warning: trigraph converted to '[' character [-Wtrigraphs]
puts("hello world!???(y/n)");
1 warning generated.
不过在去掉-Wall警告后,可以发现没有任何警告,一切都安静了.但这不是我们想要的,因为可能放过一些真正隐含错误类的警告.大家可以看到警告提示中写明了该警告的类型:-Wtrigraphs.我们只要加上在W后面加上no即可屏蔽该警告,不过要放在Wall选项后面,如果放在前面,仍然会有警告哦.编译器应该是以最后一个"有效"选项为准呀!
wisy@wisy-ThinkPad-X61:~/src/c_src$ gcc -Wall -Wno-trigraphs -std=c11 -O3 -g0 -s -o x x.c
用云栖社区APP,舒服~
【云栖快讯】首届阿里巴巴中间件技术峰会,揭秘阿里10年分布式技术沉淀!阿里高可用体系核心缔造者、全链路压测创始人,DRDS与TDDL负责人等大咖出场,干货分享,不可错过!&&
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
RDS是一种稳定可靠、可弹性伸缩的在线数据库服务。支持MySQL、SQL Server、PostgreSQL、高...
2017杭州云栖大会火热抢票
Loading...}

我要回帖

更多关于 gcc编译忽略警告 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信