Summary
Take warnings to heart: Use your compiler's highest warning level. Require clean (warning-free) builds.Understand all warnings. Eliminate warnings by changing your code, not by reducing the warning level.
要重视warning信息:使用编译器的最高警告级别。要求干净的(没有warning)的build。要明白全部的warning信息的含义,通过修改代码来消除warning信息,而不是通过降低警告级别。
这章主要强调了警告信息的重要性,通常的警告信息都是有含义的,但是在我刚刚开始学习编程的时候总是忽略它们,呵呵,不过现在我不这么做了。
书中介绍了两种消除警告信息的方法:
a) understand it; and then b) rephrase your code to eliminate the warning and make it clearer to both humans and compliers that the code does what you intended.
a)搞清楚警告信息的含义
b)修改代码来消除警告,让他人和编译器都能清楚地明白我们的代码究竟要做些什么。
Eamples:
1、Athird-party header file. 第三方的头文件。
我们经常在使用别人提供的库的时候遭遇警告信息,通常我们都没有办法修改库的代码,这怎么办呢?书中的例子给了一个方法:
……
#pragma warning(push) // disable for this header only
# pragma warning(disable : 4512)
# pragma warning(disable : 4180)
#include <boost/lambda/lambda.hpp>
#pragma warning(pop) // restore original warning level
……
2、Unused function parameter.没有用到的函数参数。
这个例子我在实际的工作中也经常碰到,定义函数的时候用了某个参数,但在函数实现的时候又不用它了。书中对这种警告的建议很简单:坚决的删除它!
3、Variable defined but never used. 定义的变量没有被使用过。
这也是经常出现的毛病,以为需要一个变量,但是到后来又没有用到,编译器会抱怨说有个参数没有用过,如果你确实不想删除这个变量,又很想让编译器闭嘴,那可以这么做:
……
void Fun() {
Lock lock;
lock; // 让变量自己变成一个表达式,不影响运行时的速度
}
……
4、Variable may be used without being initialized. !!!有个变量没有初始化就使用了。
呵呵,又一个常见问题,朋友们,定义了变量要时刻记得初始化呀。
5、Missing return.缺少返回语句。
时常发生。定义了一个又返回值得函数,然后忘了让它返回一个值了,这里给了一个switch的例子,就是要求switch语句要有default,并且记得要返回值:
// warning : missing "return"
int Fun(Color c) {
switch (c) {
case Red: return 2;
case Green: return 0;
case Blue:
case Black: return 1;
}
}
// new version : eliminates warning
int Fun(Color c) {
switch (c) {
case Red: return 2;
case Green: return 0;
case Blue:
case Black: return 1;
default: assert(!"should never get here!"); // !"string" evaluates to false
return -1;
}
}
6、Signed/unsigned mismatch.
类型不匹配的情况也会导致警告信息出现。所以,要么都换成相同的类型,要么就给个explicit cast。
Exceptions
有些时候编译器会发出一些让人困惑的甚至假的警告信息出来,但是请不要简单的关掉警告,虽然有些时候你很忙,没空处理这些无聊的东东。那么就在像前面提到的,单独的禁止掉某些警告信息,然后在你禁止掉这些警告的地方,写下清楚得注释,说明为什么必须处理掉这几条警告信息。
Take warnings to heart: Use your compiler's highest warning level. Require clean (warning-free) builds.Understand all warnings. Eliminate warnings by changing your code, not by reducing the warning level.
要重视warning信息:使用编译器的最高警告级别。要求干净的(没有warning)的build。要明白全部的warning信息的含义,通过修改代码来消除warning信息,而不是通过降低警告级别。
这章主要强调了警告信息的重要性,通常的警告信息都是有含义的,但是在我刚刚开始学习编程的时候总是忽略它们,呵呵,不过现在我不这么做了。
书中介绍了两种消除警告信息的方法:
a) understand it; and then b) rephrase your code to eliminate the warning and make it clearer to both humans and compliers that the code does what you intended.
a)搞清楚警告信息的含义
b)修改代码来消除警告,让他人和编译器都能清楚地明白我们的代码究竟要做些什么。
Eamples:
1、Athird-party header file. 第三方的头文件。
我们经常在使用别人提供的库的时候遭遇警告信息,通常我们都没有办法修改库的代码,这怎么办呢?书中的例子给了一个方法:
……
#pragma warning(push) // disable for this header only
# pragma warning(disable : 4512)
# pragma warning(disable : 4180)
#include <boost/lambda/lambda.hpp>
#pragma warning(pop) // restore original warning level
……
2、Unused function parameter.没有用到的函数参数。
这个例子我在实际的工作中也经常碰到,定义函数的时候用了某个参数,但在函数实现的时候又不用它了。书中对这种警告的建议很简单:坚决的删除它!
3、Variable defined but never used. 定义的变量没有被使用过。
这也是经常出现的毛病,以为需要一个变量,但是到后来又没有用到,编译器会抱怨说有个参数没有用过,如果你确实不想删除这个变量,又很想让编译器闭嘴,那可以这么做:
……
void Fun() {
Lock lock;
lock; // 让变量自己变成一个表达式,不影响运行时的速度
}
……
4、Variable may be used without being initialized. !!!有个变量没有初始化就使用了。
呵呵,又一个常见问题,朋友们,定义了变量要时刻记得初始化呀。
5、Missing return.缺少返回语句。
时常发生。定义了一个又返回值得函数,然后忘了让它返回一个值了,这里给了一个switch的例子,就是要求switch语句要有default,并且记得要返回值:
// warning : missing "return"
int Fun(Color c) {
switch (c) {
case Red: return 2;
case Green: return 0;
case Blue:
case Black: return 1;
}
}
// new version : eliminates warning
int Fun(Color c) {
switch (c) {
case Red: return 2;
case Green: return 0;
case Blue:
case Black: return 1;
default: assert(!"should never get here!"); // !"string" evaluates to false
return -1;
}
}
6、Signed/unsigned mismatch.
类型不匹配的情况也会导致警告信息出现。所以,要么都换成相同的类型,要么就给个explicit cast。
Exceptions
有些时候编译器会发出一些让人困惑的甚至假的警告信息出来,但是请不要简单的关掉警告,虽然有些时候你很忙,没空处理这些无聊的东东。那么就在像前面提到的,单独的禁止掉某些警告信息,然后在你禁止掉这些警告的地方,写下清楚得注释,说明为什么必须处理掉这几条警告信息。