使用函数声明进行函数指针初始化 - 是否可能

Function pointer initialization with function declaration - is it possible?

本文关键字:函数 是否 初始化 声明 指针      更新时间:2023-10-16

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

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

或者这个:

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

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

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

[现场示例]

但是,我认为这是丑陋的,不可读的代码,并且永远不会建议实际使用它。所以,我的回答是:"这是可能的,但永远不应该这样做。(我可以想象在某些涉及宏的情况下它是可以原谅的,但仅此而已(。

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

您可能希望改用无捕获的 lambda 表达式:

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

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

但是,可以使用编译单元(也称为源文件(中先前声明的函数(或变量(来组合表达式

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 };

并且等效于前一个。