有这段代码:
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
变量)?
答案 0 :(得分: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
来明确地获得函数指针。
答案 1 :(得分:0)
函数f
的参数g
实际上是函数指针类型。任何函数类型参数都转换为函数指针类型:
在确定每个参数的类型后,任何类型为“T of T”或“函数返回T”的参数都将被调整为“指向T的指针”或“指向函数返回T的指针”。
但是,正常的变量声明不会发生这种情况。 void z() = a;
声明一个函数,然后尝试初始化它。你不能这样做,因为函数不是变量。
答案 2 :(得分:0)
没有“函数变量”之类的东西,它必须是指针或对函数的引用。 (其他语言可能只是隐藏变量是指针或引用的事实。)
答案 3 :(得分:0)
在void g(void f() = a)
中,f
不是函数类型;它是一个指向函数的指针。 (参见void h(int x[3])
,其中x
是指向int
的指针)。在void f() = a;
f
中确实是一个函数类型,你不能创建一个函数类型的变量。