使用函数声明初始化函数指针 - 可能吗?

Function pointer initialization with function declaration - is it possible?

在C++中可以用函数声明来初始化函数指针吗?我的意思是,像这样:

void (*pointer)(void) = &( void function(void) );

或者这个:

void (*pointer)(void) = void function(void);

不,因为 C++ 中的任何变量(包括函数指针)都必须用 表达式 初始化,并且函数声明不是表达式。

您可能想改用无捕获 lambda 表达式:

void (*pointer)() = []{ std::cout << "hello world\n"; };

几乎可以,你只需要颠倒顺序:先声明函数,然后用它的地址初始化指针:

void function(), (*pointer)() = &function;

[Live example]

但是,我认为这段代码丑陋且不可读,绝不会建议实际使用它。所以,我的回答是:"It's possible, but should never be done." (我可以想象它在某些涉及宏的情况下是可以原谅的,但仅此而已)。

否,因为指针(包括函数指针)必须使用表达式进行初始化。函数声明不是表达式。

但是,表达式可以使用先前在编译单元(又名源文件)中声明的函数(或变量)组成

void function();     //  declare the function, defined elsewhere

void (*pointer)() = function;   //  function name in an expression is converted to a function pointer

可以(出于可读性目的不推荐)将两者组合在一个声明的多个变量中。

void function(), (*pointer)() = function;

初始化程序不能是声明。它没有任何意义。您在声明时已经指定了指针的类型。

如果你声明了一个指针并且想在必须给它赋值时初始化它。

这是一个演示程序。它使用一个函数指针数组(更有趣)。

#include <iostream>

void f1()
{
    std::cout << "Hello ";
}

void f2()
{
    std::cout << "Roman Kwaśniewski";
}

void f3()
{
    std::cout << '\n';
}

int main()
{
    void ( *fp[] )() = { f1, f2, f3 };

    for ( auto &func : fp ) func();
}

程序输出为

Hello Roman Kwaśniewski

请注意,您不需要指定例如 &f2 作为初始值设定项,因为函数指示符会隐式转换为指针。

虽然例如这个初始化也是正确的

    void ( *fp[] )() = { f1, %f2, f3 };

相当于上一个