将负面文字作为无符号参数传递时,g ++会发出警告吗?

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,但是这发出警告每次从转换intunsigned并迅速太烦人(它警告每次指数与一个载体int,vec[i]等.)

gcc可以警告将负文字或其他负编译时常量作为无符号参数传递吗?

DrM*_*DrM 0

-Wconversion 将警告您传递参数中的隐式转换。如果您想将警告视为错误,请添加 -Werror。

\n\n

这是我的测试及其结果。

\n\n

源代码文件temp.c:

\n\n
unsigned foo(unsigned u) {\n    return u;\n}\n\nint main() {\n  foo(-1);\n}\n
Run 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       ^\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果将参数更改为 1,然后再次编译,警告就会消失。

\n\n

(此外,始终使用 -Wall 也是一个好主意)。

\n