如何检查函数指针是否存在

时间:2014-04-30 18:25:10

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

在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;
}

但这似乎不起作用。这样做的最佳方式是什么?

3 个答案:

答案 0 :(得分:3)

检查NULL是否正常。但是不可能将指针传递给首先不存在的函数。所以你不必担心这个。虽然可以在不定义函数的情况下声明函数并传递它的地址。在这种情况下,您将收到链接器错误。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

#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";
    }
}

如果你想扔掉&#39;例外,你需要抓住&#39;它也是。 你的代码失败了,原因很简单, 1)您没有检查函数指针的值。 2)你没有正确捕捉抛出的异常。