2

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

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

或这个:

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

4 回答 4

1

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

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

void (*pointer)() = []{ std::cout << "hello world\n"; };
于 2019-07-19T11:47:03.450 回答
1

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

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

[现场示例]

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

于 2019-07-19T11:55:54.393 回答
0

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

如果您声明一个指针并希望在必须为其分配一些值时对其进行初始化。

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

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

并且等同于前一个。

于 2019-07-19T12:13:07.017 回答
0

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

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

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;
于 2019-07-19T12:00:08.920 回答