我有一些返回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");
}
}
是否表明实际上正在调用函数?
答案 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;
}