首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在将空指针传递给函数时确保编译错误

在将空指针传递给函数时确保编译错误
EN

Stack Overflow用户
提问于 2022-01-23 09:24:42
回答 3查看 422关注 0票数 -1

假设我有一个函数,它接收指针。

代码语言:javascript
复制
int functionA(int* a, int* b)
{
    ...
}

我可以在functionA中添加空检查。是否有一种方法可以确保在nullptr作为参数传递时编译时发生错误。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-01-23 10:36:17

是一种方法,我可以确保当nullptr作为参数传递时,编译时就会发生错误。

如果您具体指的是nullptr关键字,那么就算是吧。您可以提供在这种情况下将选择的重载,并将其定义为“删除”。这是工作的,只要你没有显式绕过超载,例如,铸造。

代码语言:javascript
复制
int functionA(int*, std::nullptr_t) = delete;
int functionA(std::nullptr_t, int*) = delete;

// ...
functionA(&i, &j)            // OK
functionA(nullptr, &i);      // error
functionA(&i, nullptr);      // error
functionA(nullptr, nullptr); // error

NULL

除了以前的重载之外,这还需要为整数添加重载:

代码语言:javascript
复制
int functionA(int*, int) = delete;
int functionA(int, int*) = delete;

// ...
functionA(NULL, &i);      // error
functionA(&i, NULL);      // error
functionA(NULL, NULL);    // error

如果您指的是任何带空值的指针,那么就不能这样做,因为函数参数的值通常不能在编译时被知道。

如果您的目标是不使用指针作为迭代器,那么将更安全、更方便地传递引用。

票数 2
EN

Stack Overflow用户

发布于 2022-01-23 12:18:36

这里要做的正确的事情是使用引用。

代码语言:javascript
复制
int functionA(int& a, int& b);

关于引用的心理模型是:这些指针不应该表示nullptr。

票数 2
EN

Stack Overflow用户

发布于 2022-01-23 11:45:13

经过一小时的谷歌搜索,我终于找到了一种方法来实现这一目标。如果您真的想做编译时检查,这就是实现它的方法。

代码语言:javascript
复制
#include <iostream>
#include <cstdlib>

template<typename T, T* N>
static void ValidatePtr() {
    std::static_assert(N != nullptr);
}

int main() {
    constexpr int* ptr = nullptr;
    ValidatePtr<int, ptr>();

    std::cout << "Test" << std::endl;
}

快速运行:如果需要验证函数的编译时指针,则必须确保它们是常量表达式。该方法实际上需要一个常量表达式才能编译。这将确保所传递的唯一指针必须在编译时确定。您不能使用&variable引用其他变量的地址,因为它会引发编译器错误,因此必须像constexpr int* ptr = nullptr;constexpr int* ptr = (int*)0xFFFFFFFF那样专门键入。

但是,如果希望检查动态变量,则需要在运行时进行检查,因为如果不使用constexpr来确定地址,就无法进行检查。

在内存实用程序之外,我看不出这是什么用途。

我强烈建议对nullptr进行运行时检查,如果您认为有必要,可以使用普通的assert调用而不是static_assert,或者使用throw引发异常。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70820698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档