声明一个void C ++类型的函数数组

时间:2015-07-27 00:05:14

标签: c++ function-pointers

我有一些返回void的函数。我指出了这些函数并希望得到这些函数的数组:

为什么此代码有效:

#include <cstdio>
using std::puts;

void tell() {
  puts("hi");
};

void slap() {
  puts("goodbye");
}

int main(int argc, char *argv[])
{

  void (*tp)() = tell;
  void (*sp)() = slap;

  void(*funcs[])() = {tp, sp};
  for (auto point:funcs) {
    point();
  }
  return 0;
}

当我尝试使用funcs中的指针而没有指定void(funcs[])() = {tp, sp};中的指针时(" error: 'funcs' declared as array of functions of type 'void ()' "我得到()这正是它们的原因 - 那么为什么会出错呢?

我也没有得到语法,void(*funcs[])()末尾的public class ExampleController : Controller { public ActionResult Test() { TestViewModel model = new TestViewModel { Id = Guid.NewGuid().ToString(), Name = "Foo bar" }; return this.View(model); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Test(TestViewModel model) { if (!this.ModelState.IsValid) { return this.View(model); } return this.Content("Success"); } } 是否表明实际上正在调用函数?

4 个答案:

答案 0 :(得分:4)

C ++标准8.3.5 / 10说:

  

虽然可以有函数指针数组,但是没有函数数组。

&#34; funcs&#34;的声明必须使用&#34;螺旋规则&#34;:

阅读

funcs[]funcs是一个数组

*funcs[]funcs是一个指针数组

(*funcs[])()funcs是指向没有参数的函数的指针数组

void (*funcs[])()funcs是指向函数的指针数组,没有返回void的参数。

答案 1 :(得分:2)

如果没有星号,void (funcs[])()会向函数声明一个函数数组而不是指针数组。后者在C ++语法中是允许的,而前者不是。

[dcl.array] / P1:

  

T被称为数组元素类型;此类型不应是引用类型,(可能是cv限定的)类型void函数类型或抽象类类型。

初始化列表({tp, sp})的内容是函数,但它们通过函数到指针转换转换为指针:

[conv.func] / P1

  

函数类型T的左值可以转换为类型为“T指针”的prvalue。结果是指向函数的指针。

请注意,C ++也不允许引用数组。

  

我也没有得到语法,()末尾的void(*funcs[])()是否表明实际上正在调用函数?

不,这是数组类型的声明。 ()是类型构造的一部分,它指定函数的参数列表。整个类型表示&#34;一个指向函数的指针数组,这些函数采用零参数(())并返回void&#34; 。使用类型别名可能会更清楚:

using void_f = void (*)();
void_f funcs[] = {tp, sp};

答案 2 :(得分:2)

你可以明确地声明它:

void (*actions[5])();

但这是几乎不可读 为了使其更具可读性,请使用typedef。

typedef void(*Action)();    // Action is the typename for a pointer
                            // to a function return null and taking
                            // no parameters.

Action   actions[5];        // An array of 5 Action objects.

或者出于您的目的:

int main()
{
     Action   actions[] = {&tell, &slap};
}

答案 3 :(得分:-1)

像这样使用:

int main(int argc, char *argv[])
{
    void (*tp)() = tell;
    void (*sp)() = slap;

    void (*funcs[])() = {tp, sp};
    for (void (*point)():funcs)
    {
        point;
    }
    return 0;
}