gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:47:14 24 4
gpt4 key购买 nike

考虑:

unsigned foo(unsigned u) {
return u;
}

int main() {
foo(-1);
return 0;
}

在这里,函数 foo 被调用时 u 等于 4294967295(或类似的大值)。如果程序员不注意,这可能相当出乎意料。

例如,也许您正在实现 pow 以将 Polynomial 类提升为幂。因为只有正幂是可能的,所以你决定签名

Polynomial pow(const Polynomial& p, unsigned exp);

然后一个粗心的程序员调用 pow(p, -1) 得到一个逆函数,而不是一个警告或错误,它似乎可以工作,但可能会使用大量的内存和时间产生一个完全错误的答案。

g++ 5.3.0 和 gcc 5.3.0,使用 -Wall -Wextra 编译它。

他们会用选项 -Wsign-conversion 发出警告,但这会警告 intunsigned 的转换 并且很快就太烦人了(例如,每次您使用 intvec[i] 索引到 vector 时它都会发出警告。)

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

最佳答案

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

这是我的测试及其结果。

源代码文件temp.c:

unsigned foo(unsigned u) {
return u;
}

int main() {
foo(-1);
}

和编译,

$ gcc -o temp temp.c -Wconversion
temp.c: In function ‘main’:
temp.c:6:7: warning: negative integer implicitly converted to unsigned type [-Wsign-conversion]
foo(-1);
^

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

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

关于c++ - 将负文字作为无符号参数传递时,g++ 会发出警告吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36942096/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com