我就喜欢多多的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 抹杀在摇篮中!