使用函数声明初始化函数指针 - 可能吗?
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;
但是,我认为这段代码丑陋且不可读,绝不会建议实际使用它。所以,我的回答是:"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 };
相当于上一个
在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;
但是,我认为这段代码丑陋且不可读,绝不会建议实际使用它。所以,我的回答是:"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 };
相当于上一个