c ++将函数作为参数传递给另一个带有void指针的函数

时间:2013-06-05 13:56:51

标签: c++ function pointers arguments void

我正在尝试使用void指针将函数作为参数传递给另一个函数,但它不起作用

#include <iostream>
using namespace std;

void print()
{
    cout << "hello!" << endl;
}

void execute(void* f()) //receives the address of print
{
    void (*john)(); // declares pointer to function
    john = (void*) f; // assigns address of print to pointer, specifying print returns nothing
    john(); // execute pointer
}

int main()
{
    execute(&print); // function that sends the address of print
    return 0;
}

这是虚函数指针,我可以创建一个更简单的代码,如

#include <iostream>
using namespace std;

void print();
void execute(void());

int main()
{
    execute(print); // sends address of print
    return 0;
}

void print()
{
    cout << "Hello!" << endl;
}

void execute(void f()) // receive address of print
{
    f();
}

但我想知道我是否可以使用void指针

用于实现类似的东西

void print()
{
    cout << "hello!" << endl;
}

void increase(int& a)
{
    a++;
}

void execute(void *f) //receives the address of print
{
    void (*john)(); // declares pointer to function
    john = f; // assigns address of print to pointer
    john(); // execute pointer
}

int main()
{
    int a = 15;
    execute(increase(a));
    execute(&print); // function that sends the address of print
    cout << a << endl;
    return 0;
}

2 个答案:

答案 0 :(得分:5)

使用gcc test.cpp我得到:

test.cpp: In function ‘void execute(void* (*)())’:
test.cpp:12:22: error: invalid conversion from ‘void*’ to ‘void (*)()’ [-fpermissive]
test.cpp: In function ‘int main()’:
test.cpp:18:19: error: invalid conversion from ‘void (*)()’ to ‘void* (*)()’ [-fpermissive]
test.cpp:9:6: error:   initializing argument 1 of ‘void execute(void* (*)())’ [-fpermissive]

f参数的签名不正确。你需要使用

void execute(void (* f)())

代替。因此,在分配给john

时,您不需要演员表
john = f

此外,您可以直接致电f来简化此事:

f(); // execute function pointer

编辑:由于您要使用void指针,因此需要将f作为void指针传递:

void execute(void *f)

在这里,您需要分配到john,但由于f已经是void *,您不需要演员。

注意:鉴于您正在传递一个void指针,execute函数将接受任何内容,如果您传递了错误的内容,您将遇到运行时错误。例如:

void print_name(const char *name)
{
    printf("%s", name);
}

void execute1(void *f);
void execute2(void (*f)());

int main()
{
    int value = 2;
    execute1(&value); // runtime crash
    execute1(&print_name); // runtime crash
    execute2(&value); // compile-time error
    execute2(&print_name); // compile-time error
}

使用特定定义的函数指针可让编译器在传递错误参数类型的位置生成错误。这在运行时崩溃是首选,因为运行时崩溃可能被利用为安全漏洞,需要进行大量测试以确保不会发生此错误。

答案 1 :(得分:0)

使用

void execute(void (*f)()) //receives the address of print

或者更好地使用:

void execute(boost::function<void()> const & f) //receives the address of print

如果您使用的是支持C ++ 11的编译器,也可以接受仿函数,或者将boost::替换为std::