c – 防止从false到指针的无声转换

前端之家收集整理的这篇文章主要介绍了c – 防止从false到指针的无声转换前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个功能
void foo(int *bar)
{}

如果我像这样调用foo,Visual Studio 2012现在将很乐意并且没有警告编译:

int main()
{
  foo(false);
  return 0;
}

但是,如果我将foo(false)更改为foo(true),则会出现错误

1>main.cpp(132): error C2664: 'foo' : cannot convert parameter 1 from 'bool' to 'int *'
1>          Conversion from integral type to pointer type requires reinterpret_cast,C-style cast or function-style cast

知道如何确保在传递false时我也会收到错误吗?我唯一的想法是添加第二个私有函数“void foo(bool bar)”.然后我确实得到了所谓的错误,声明foo(bool bar)是私有的.但这只适用于从类外部调用foo并且它使我的界面混乱的情况.

解决方法

首先,关于为什么它接受false而不是true:文字false将被解释为整数0,文字0将转换为任何类型的空指针.另一方面,true无法转换为指针类型,因为它转换为整数1.

至于如何解决您的问题:只要您没有实现私有过载,您的方法对于公共和非公共调用方都可以正常工作.在这种情况下,公共调用者将收到编译错误,成员调用者将收到链接错误.

但是,您可能还想考虑其他事项.

你的函数是否需要接受空指针?如果没有,请将其更改为通过引用接受而问题就会消失.

如果你的函数确实需要接受空指针那么我建议在这种情况下只是相信你的用户正确调用它而不是混乱你的界面试图防止每一个可能的误用.

原文链接:https://www.f2er.com/c/120156.html

猜你在找的C&C++相关文章