【问题标题】:How to check a function pointer exists如何检查函数指针是否存在
【发布时间】:2014-04-30 18:25:10
【问题描述】:

在 C++ 中,我正在尝试使用函数指针编写函数。如果为不存在的函数传递函数指针,我希望能够抛出异常。我试图像处理普通指针一样处理函数指针并检查它是否为空

#include <cstddef>
#include <iostream>

using namespace std;

int add_1(const int& x) {
    return x + 1;
}

int foo(const int& x, int (*funcPtr)(const int& x)) {
    if (funcPtr != NULL) {
        return funcPtr(x);
    } else {
        throw "not a valid function pointer";
    }
}

int main(int argc, char** argv) {
try {
    int x = 5;

    cout << "add_1 result is " << add_1(x) << endl;

    cout << "foo add_1 result is " << foo(x, add_1) << endl;
    cout << "foo add_2 result is " << foo(x, add_2) << endl; //should produce an error
}
catch (const char* strException) {
    cerr << "Error: " << strException << endl;
}
catch (...) {
    cerr << "We caught an exception of an undetermined type" << endl;
}
    return 0;
}

但这似乎不起作用。最好的方法是什么?

【问题讨论】:

  • 能贴出调用代码吗?
  • 您是否至少通过传递NULLnullptr 作为函数指针的参数来测试它?
  • @RSahu 我已经添加了更多关于如何使用它的代码。
  • @CaptainObvlious 我更关心传递一个不存在的函数而不是传递一个空指针。我只是想弄清楚如何去做。
  • @John,带有add_2 的行如果未声明将导致编译器错误,如果已声明但未定义则会导致链接时错误。

标签: c++ exception pointers exception-handling function-pointers


【解决方案1】:

检查 NULL 没问题。但是不可能将指针传递给一开始就不存在的函数。所以你不必担心这个。虽然可以只声明一个函数而不定义它并传递它的地址。在这种情况下,您将收到链接器错误。

【讨论】:

  • 为什么不能将指针传递给不存在的函数?
  • @juanchopanza:嗯,你可以使用memcpy() 之类的东西将垃圾复制到函数指针对象中。除此之外,没有办法构造一个不指向实际函数的函数指针值(空指针除外)。
  • @KeithThompson 你不能只传递一个未初始化的函数指针吗?
  • 所以,总而言之,这个答案的第二和第三句是错误的。
  • @KeithThompson:或者只是将任意整数转换为函数指针类型
【解决方案2】:

如果你传递一个不存在的指针,它会自动抛出一个错误,如果你声明一个指针,那么你必须用 null 来初始化它以避免垃圾值,所以与 null 比较将没有任何作用。

你仍然想检查然后尝试分配一些功能(如添加,子等),如果它需要然后确定,如果没有那么它将再次显示错误,如前所述。

【讨论】:

  • “如果您传递不存在的指针,它将自动抛出错误” 该标准没有说明“抛出错误”。这是未定义的行为。任何事情都有可能发生。
【解决方案3】:
#include<cstddef>
#include <iostream>
using namespace std;

int foo(const int& x, int (*funcPtr)(const int& x)) {
    if (*funcPtr != NULL) {
        return funcPtr(x);
    }
    else
    {
        cout << "not a valid function pointer";
    }
}

如果你想“抛出”异常,那么你也需要“捕捉”它。 简而言之,您的代码失败有两个原因, 1)您没有检查函数指针的值。 2)您没有正确捕获抛出的异常。

【讨论】:

    猜你喜欢
    • 2021-03-06
    • 2012-06-10
    • 2015-06-30
    • 1970-01-01
    • 2014-02-18
    • 2015-07-24
    • 2011-06-07
    相关资源
    最近更新 更多