代码之家  ›  专栏  ›  技术社区  ›  KcFnMi

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

  •  2
  • KcFnMi  · 技术社区  · 7 年前

    以下是在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);
    }
    

    它与 $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);
    }
    

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

    $ 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.
    

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

    1 回复  |  直到 7 年前
        1
  •  12
  •   Pete Becker    7 年前

    在C语言中, void f() 宣布 f 是接受未指定数量的参数并返回 int 是的。在C++中声明 F型 成为一个不带参数并返回 内景 是的。在C语言中,如果你想写一个不带参数的函数 void 作为参数列表: void f(void) 声明一个不带参数且不返回任何内容的函数。

    除非您有充分的理由这样做,否则编写问题代码的方法是 void foo(void (*func)(int), int i) 是的。上面写着 func 是指向接受一个类型的参数的函数的指针。 内景 回报 无效 .