Nic*_*teo 6 c c++ gcc g++ compiler-warnings
考虑:
unsigned foo(unsigned u) {
return u;
}
int main() {
foo(-1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这里,函数foo被调用u等于4294967295(或类似的大值.)如果程序员没有注意,这可能是非常意外的.
例如,您可能正在实施pow将Polynomial类提升为幂.由于只有正权力,您可以决定签名
Polynomial pow(const Polynomial& p, unsigned exp);
Run Code Online (Sandbox Code Playgroud)
然后一个粗心的程序员调用pow(p, -1)得到一个逆,而不是一个警告或错误,它似乎工作,但可能使用极大的内存和时间来产生一个完全错误的答案.
g ++ 5.3.0和gcc 5.3.0,无需投诉即可编译-Wall -Wextra.
他们将警告它的选项-Wsign-conversion,但是这发出警告每次从转换int到unsigned并迅速太烦人(它警告每次指数与一个载体int,vec[i]等.)
gcc可以警告将负文字或其他负编译时常量作为无符号参数传递吗?
-Wconversion 将警告您传递参数中的隐式转换。如果您想将警告视为错误,请添加 -Werror。
\n\n这是我的测试及其结果。
\n\n源代码文件temp.c:
\n\nunsigned foo(unsigned u) {\n return u;\n}\n\nint main() {\n foo(-1);\n}\nRun Code Online (Sandbox Code Playgroud)\n\n还有编译,
\n\n$ gcc -o temp temp.c -Wconversion\ntemp.c: In function \xe2\x80\x98main\xe2\x80\x99:\ntemp.c:6:7: warning: negative integer implicitly converted to unsigned type [-Wsign-conversion]\n foo(-1);\n ^\nRun Code Online (Sandbox Code Playgroud)\n\n如果将参数更改为 1,然后再次编译,警告就会消失。
\n\n(此外,始终使用 -Wall 也是一个好主意)。
\n