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

时间:2019-07-19 11:45:41

标签: c++ pointers initialization declaration

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

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

或者这个:

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

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

几乎有可能,您只需要颠倒顺序即可:首先声明该函数,然后使用其地址初始化指针:

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

[Live example]

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

答案 2 :(得分:0)

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

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

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;

答案 3 :(得分: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 };

等效于上一个。