C / C ++:使用typedef&#d; d函数指针来*声明*一个函数

时间:2016-04-05 17:41:51

标签: c++ c

我需要输入一个函数指针类型来创建一个指针数组,来声明大量的函数,这些函数最终会出现在数组中。但是,我无法找到同时完成这两件事的方法:要么我可以获取数组的指针,要么我可以声明函数,但不能同时声明两者。

关于如何在没有大量无意义文本的情况下使代码工作的任何想法,或者我是否仍然需要为我需要声明的每个函数重复整个函数签名?感谢。

#include <stdio.h>

// declare a fn ptr type named 'myfunc'
typedef void (*myfunc)(int);

//myfunc A,B,C,etc;  **doesn't work, because of the (*)
void A(int);         // does work, but becomes very tedious

int main() {
   myfunc B = A;     // actually assigning a large 2D array
   A(42);
   B(43);
}

void A(int foo) {
   printf("%d\n", foo);
}

4 个答案:

答案 0 :(得分:4)

在C ++中,您可以使用

  .factory('toastHttpInterceptor', function ($injector) {
    return {
      responseError: function(response) {
        var $mdToast = $injector.get('$mdToast');
        $mdToast.showSimple('Error');
      }
    };
  });

或者为函数类型声明一个typedef,为函数类型指定另一个typedef:

std::remove_pointer_t<myfunc> A, B, C;

后者适用于C和C ++。

答案 1 :(得分:2)

标准非常明确禁止这一点(来自[dcl.fct]):

  

函数类型的typedef可用于声明函数,但不得用于定义函数(8.4)。 [例如:

typedef void F();
F fv;              // OK: equivalent to void fv();
F fv { }           // ill-formed
void fv() { }      // OK: definition of fv
     

-end example]

在你的情况下,你可以写:

using F = std::remove_pointer_t<myfunc>;
F A, B, C;

但是你仍然需要使用普通的函数声明器来定义这些函数,这样除了神秘之外不会取得多大的成就。

答案 2 :(得分:1)

您可以使用typedef

声明一个(成员)函数
typedef int F(int);
F f; // declare a function

int main() { f(1); } // and call it

但你不能使用typedef 定义

答案 3 :(得分:1)

你可以做

using myfunc = void (int);

myfunc A, B, C, etc;

对于指针功能:

myfunc* f = A;

Demo