使用函数声明进行函数指针初始化 - 是否可能
Function pointer initialization with function declaration - is it possible?
是否可以在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 };
并且等效于前一个。
相关文章:
- 函数是否可以访问传递给main()的参数
- 根据某个函数是否存在启用模板
- 无论如何,我可以确定构造函数是否存在吗?
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 如何检查函数是否在LLVM Instrumentation pass的ModulePass的系统头文件中定义?
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 在对象构造期间,将指向尚未构造的子对象的指针传递给另一个子对象的构造函数是否危险?
- 某些 boost::asio 异步函数是否将处理程序连接到操作,以便处理程序被触发一次?
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 由并发无序映射查找线程调用的函数是否安全?
- 使用静态成员函数而不是普通函数是否有任何开销?
- 从其存储的回调中删除 std::函数是否安全
- 析构函数是否会自动调用 delete[] C++?
- 构造函数是否有一种现代C++方法来了解其'container'类?
- 循环中本地对象的析构函数是否保证在下一次迭代之前被调用?
- 移动构造函数是否C++过时?
- 在 c++ 中将对象设置为等于同一类的构造函数是否有效?
- 此函数是否会在C++中创建内存泄漏?
- 具有默认值的单个参数构造函数是否与默认构造函数相同?
- 如何检测构造函数是否与抛出的析构函数无关