1

有这个代码:

void a() { }

// function parameter first defined as function, then as pointer to function
void g(void f() = a, void (*d)() = a) {
}

int main(){
   void (*z)() = a; // works ok
   //void z() = a; error: illegal initializer (only variables can be initialized)
   return 0;
}

在函数参数列表中,您可以将函数参数定义为函数或函数指针(参见函数g参数列表)。然而,在main函数中,只有指向函数版本的指针似乎有效。有没有办法在块范围内定义函数变量(不是函数指针)(如函数中的void f() = a变量g)?

4

4 回答 4

2

C++ 中不能有函数类型的变量。但是,您可以拥有函数的指针或引用:

typedef void (funtype)();

void call(funtype & f) { f(); } // OK, funtype & == void (&)()
void call(funtype * g) { g(); } // Also OK, funtype * == void (*)()

从某种意义上说,你总是通过函数指针调用函数:值为函数的表达式立即衰减到对应的函数指针。所以在上面的例子中,f(),(*f)()等等(**f)()都是调用函数的有效方式,对于g. 但是通过引用传递的好处是你仍然可以通过&f.

于 2013-05-18T15:30:07.123 回答
0

f您的函数的参数g实际上是函数指针类型。任何函数类型参数都转换为函数指针类型:

在确定每个参数的类型后,将“T的数组”或“返回T的函数”类型的任何参数分别调整为“指向T的指针”或“返回T的函数的指针”。

但是,对于普通的变量声明,这不会发生。void z() = a;声明一个函数,然后尝试初始化它。你不能这样做,因为函数不是变量。

于 2013-05-18T15:31:43.827 回答
0

没有所谓的“函数变量”,它必须是一个指针或一个函数的引用。(其他语言可能只是隐藏了变量是指针或引用的事实)。

于 2013-05-18T15:31:48.943 回答
0

void g(void f() = a)中,f不是函数类型;它是指向函数的指针。(参见void h(int x[3]),其中x是指向 的指针int)。Invoid f() = a; f确实是一种函数类型,您不能创建函数类型的变量。

于 2013-05-18T15:31:55.790 回答