编译器编译c++代码,有时候难免会有一些报警信息,不要小看这些warning,很多warning都值得注意,warning在某些情况下会引发error。能解决的warning,最好就把它搞定吧。当然大家都喜欢看到“0 warning,0 error”。
1.warning: unused parameter 'argc' [-Wunused-parameter]
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
cout << "Hello World!" << endl;
return 0;
}
警告:没使用参数“XXX”。
这个警告是在告诉程序员,参数没用上,可能是忘了用,或者本来该用的地方用错参数了,又或者这个参数根本不需要。
如果参数真的不需要又不想出现这个警告(强迫症,就是不想被警告)。可以这么做:
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
(void)argc;(void)argv;
cout << "Hello World!" << endl;
return 0;
}
(void)argc;(void)argv;
这么写,其实是从QT学过来的,QT中有个Q_UNUSED,就是用来去除这种警告,它的含义如下:
#define Q_UNUSED(x) (void)x;
2.warning: suggest parentheses around assignment used as truth value [-Wparentheses]
#include <iostream>
using namespace std;
bool test_bool()
{
return false;
}
int main(int argc, char *argv[])
{
(void)argc,(void)argv;
bool ret;
if( ret = test_bool() ){
cout << "Hello World!" << endl;
}
return 0;
}
warning: suggest parentheses around assignment used as truth value [-Wparentheses]
if( ret = test_bool() ){
^
if( ret = test_bool() )其实做了两件事。第一将test_bool()的结果赋值给ret,第二然后判断ret的bool值。
之所以会有警告,因为程序员写代码的时候,有时候没注意,会出现想表达“==”,却写成“=”的情况。
这种警告加一个括号就好了。 if( (ret = test_bool()) )
3.warning: no return statement in function returning non-void [-Wreturn-type]
#include <iostream>
using namespace std;
bool test_bool()
{
}
int main(int argc, char *argv[])
{
(void)argc,(void)argv;
bool ret;
if( (ret = test_bool()) ){
cout << "Hello World!" << endl;
}
return 0;
}
有符号的函数,没有return。实例中bool test_bool() 没有return false或者true。根据实际情况加上就好了。
4. warning: variable 'XXX' set but not used [-Wunused-but-set-variable]
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
(void)argc,(void)argv;
int first,second;
second = 2;
first = 1;
cout << "Hello World!" << endl;
return 0;
}
warning: variable 'first' set but not used [-Wunused-but-set-variable]
int first,second;
^
这种警告真的很容易碰到。一句话--“先声明,先定义”。
为什么会有这种警告呢?原因是这样的:
以first、second两个变量为例,first,second一次声明,如果定义second要用到first这个值,而first并没有定义,那second初始化的值就可能会有问题。比如
second = first + 1;
first = 2;
这样就会有问题,给予警是在提醒程序员,这里可能出现类似以上问题。
5.warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char *argv[])
{
(void)argc,(void)argv;
vector<int>vec;
vec.push_back(2);
int a=1;
if( a == vec.size() ){
cout << "Hello World!" << endl;
}
return 0;
}
warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if( a == vec.size() )
^
警告:int和unsigned integer进行比较。
这种警告可以通过强转,使等号左右两边数据类型一致。
if( (uint32_t)a == vec.size() ){
6.warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
(void)argc,(void)argv;
uint32_t a=1;
if( a<0 ){
cout << "Hello World!" << endl;
}
return 0;
}
warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
if( a<0 ){
^
这种警告其实不常见,不过我确实在别人的代码里碰到了。无符号整型不可能小于0。
7.
...