【总结】【更新】gcc/g++ 编译命令小总结(关于warning信息)| CGUZ

我就喜欢多多的warning选项…

前言


编译器真是一个让人又爱又恨的东西呢… 但如果把编译器用得恰到好处的话,它对coding的益处将是巨大的。
充足而不多余的 warning 信息能够消除大部分 bug 产生的可能性、帮助 debug 以及帮助培养更好的编程习惯
所以大家千万不要无视 warning(更不要使用 -w 指令)

当然,学会从众多 warning 中找到真正有价值的、蕴含潜在风险的 warning 也不是一件易事。慢慢来吧,先了解有哪些 warning 指令可以使用,然后在实践 coding 中再慢慢摸索和领悟,最终一定能成为 de-warning 高手的!




正文


有幸在校赛前夕了解到了这些 gcc/g++ 关于 warning 的展示指令,下面详细分享给大家(有示例哦)
其中部分资料参考于:

3.8 Options to Request or Suppress Warnings
GCC(警告.优化以及调试选项)
gcc警告选项



下面是详细介绍:

-Wformat 【强烈推荐】

  • 【非常强大的警告提示】 【妈妈再也不用担心我忘加&啦】
  • 警告 printf 中的类型不匹配 / 参数遗漏 / 参数过多
  • 警告 scanf 中的类型不匹配 / 参数遗漏 / 参数过多 / 对基本数据类型进行 scanf 时 忘加&
  • 示例:
int i;
long long ll;
printf("%d", ll);	// warning,类型不匹配
printf("%s");	 	// warning,缺少参数
printf("%d%d", i);	// warning,缺少参数
scanf("%d", i);		// warning,类型不匹配(应该是&i)



-Wfloat-equal【强烈推荐】

  • 警告对浮点型之间使用 ==!= 进行比较
  • 示例:
double a, b;
...

if (a == b)		// warning,浮点进行等于号比较



-Wempty-body【强烈推荐】

  • 【妈妈再也不用担心我在 if()、while() 后面不小心加分号啦】
  • 警告未被大括号包裹住的、空的 if / for / while 语句
  • 示例:
if (a == b);	// warning,误加分号,导致if成为空语句。
{
	...
}



-Wshadow

  • 警告变量的覆盖(在小作用域中定义了与大作用域中重名的变量)
  • 示例:
int i;
...

for (int i=0; i<5; ++i)	// warning,变量覆盖



-Wswitch

  • 警告对枚举量进行 switch 时可能存在的情况遗漏
  • 示例:
enum E{A, B, C};
...

E flag;
...

switch (flag)
{
	case A:
		...
	case B:
		...
	// warning,缺少枚举值case。添加 case C 或者 default 都可以消除此 warning
}



-Wuninitialized

  • 警告未初始化就使用的变量
  • 示例:
int a;
printf("%d", a);	// warning,未初始化



-Wreturn-type

  • 警告返回值类型不为 void 的函数未提供返回值
  • 示例:
int func1(void)
{
	if (...)
	{
		...
		
		return 0;
	}

	// warning,缺少返回值。如果 if 不满足,那返回啥呢?
}

int func2(void)
{
	if (...)
		return;	// warning,缺少返回值
	...
	
	return 0;
}



-Wparentheses

  • 警告可能缺失的括号
  • 示例:
if (...)
	if (...)
		a = 2;
	else		// warning,缺失括号,可能导致语义错误
		a = 3;



-Wunused-parameter

  • 警告未使用的函数参数
  • 示例:
void func(int a)
{
	...			// warning,整个函数体内部根本就没出现a
}



-Wunused-but-set-parameter

  • 警告已赋值但未被使用的函数参数
  • 示例:
void func(int a)
{
	a = 3;
	...			// warning,虽然给a赋值了但是还是没有用a
}



-Wsizeof-pointer-memaccess

  • 警告 memset 中,第三个参数是对指针变量进行的 sizeof
  • 示例:
void func(int a[])
{
	memset(a, 0, sizeof(a));	// warning,语义错误,sizeof无法获得期望值
}



-Wconversion

  • 警告可能造成数据范围损失的(自动)类型转换
  • 示例:
void func(int a)
{
	...
}

long long t = ...;
func(t);	// warning,类型转换可能损失范围




以上就是一些个人觉得很有用的 warning 指令啦。大家可以把这些指令都打开(特别是强烈推荐的三个指令)

最后祝各位能将大部分 bug 抹杀在摇篮中!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值