带编译时&符号检查的指针参数

时间:2015-09-20 12:14:05

标签: c++

我是否可以让编译器检查我的函数是否使用&someValidVariable而不是NULL,某个变量或某个文字地址调用了需要指针参数的函数?

我想在引用参数上使用指针参数,因为那些符号使IMO代码更易于理解,但我懒得进行非NULL检查。

我可以两全其美吗?

2 个答案:

答案 0 :(得分:2)

对于nullptr,您可以添加一个以假std::nullptr_t为参数的重载。

但除此之外,它实际上是不可能的,除了你可以做的数组例外。

template<std::size_t N>
void your_function(int (&array)[N]) { ... }

而不是让它衰变为指针。

答案 1 :(得分:1)

在C ++ 11中,您可以声明接受std::nullptr_t的函数的重载,而不是定义该函数。这通常会导致链接器错误(与编译器错误不同)。 (虽然这不会阻止调用者执行类似your_function((YourVariable *)nullptr)的操作 - 这将使用NULL指针调用您的函数。)

除此之外(在任何版本的C ++中),除了一些特殊情况,例如传递对数组的引用之外,这是不可能的(这样的函数不会传递NULL或(在C ++ 11中) )nullptr)。原因是指针的基本属性是它们是按值传递的,如果类型(或允许的类型转换)有效,编译器允许它。一旦传递了值,唯一的检查方法是在函数的运行时。唯一的例外是传递一个未初始化的指针的值,这个指针本身会导致未定义的行为(所以任何事情都可能发生,所有的赌注都会关闭)。

但是,真的,你的问题的真正解决方案是传递引用。其中一个目的是保证它们引用实际对象(解除引用NULL以创建引用给出未定义的行为,就像使用对已被破坏的对象的悬空引用一样)。所以你真的需要努力更好地理解什么是引用以及如何正确使用它们,而不是试图避免使用它们。