如何将C函数指针迁移到C++?

KcF*_*nMi 2 c c++ pointers function-pointers

以下是在C中使用函数指针:

#include <stdio.h>
void bar1(int i){printf("bar1 %d\n", i+1);}
void bar2(int i){printf("bar2 %d\n", i+2);}
void foo(void (*func)(), int i) {func(i);};
int main() {
    foo(bar2, 0);
}
Run Code Online (Sandbox Code Playgroud)

它编译$gcc main.c.

以下是我尝试将其迁移到C++:

#include <cstdio>
void bar1(int i){printf("bar1 %d\n", i+1);}
void bar2(int i){printf("bar2 %d\n", i+2);}
void foo(void (*func)(), int i) {func(i);};
int main() {
    foo(bar2, 0);
}
Run Code Online (Sandbox Code Playgroud)

试图编译它,我得到错误:

$ g++ main.cpp
main.cpp:7:39: error: too many arguments to function call, expected 0, have 1
void foo(void (*func)(), int i) {func(i);};
                                 ~~~~ ^
main.cpp:10:2: error: no matching function for call to 'foo'
        foo(bar2, 0);
        ^~~
main.cpp:7:6: note: candidate function not viable: no known conversion from 'void (int)' to 'void (*)()' for 1st argument
void foo(void (*func)(), int i) {func(i);};
     ^
2 errors generated.
Run Code Online (Sandbox Code Playgroud)

如何将C函数指针迁移到C++?

Pet*_*ker 12

在C中,void f()声明f为带有未指定数量的参数并返回的函数int.在C++中,它声明f是一个不带参数和返回的函数int.在C中,如果你想编写一个不带参数的函数,你可以使用它void作为参数列表:void f(void)声明一个不带参数且不返回任何参数的函数.

除非你有充分的理由不这样做,否则在问题中编写代码的方法是void foo(void (*func)(int), int i).这func就是指向一个函数的指针,该函数接受一个类型的参数int并返回void.