以下函数指针的分配方式:
exit = (void (*)()) &jump;
不同于:
exit = &jump;
其中exit是一个函数指针,定义为:
void (*exit) ();
'jump'是一个声明为:
void jump();
最佳答案
exit = (void (*)()) &jump;
第一个使用强制转换。 这很危险,因为它会在不通知类型是否不匹配的情况下破坏程序,因为在编译时不会被捕获。
因此,如果要执行此操作:
int func() {return 1;}
auto exit = (void (*)()) &func;
...那将是不好的。但是,最好执行以下操作:
exit = &jump;
第二个使用编译时类型检查。 这样比较安全,因为编译器将在编译时检查类型。这为您提供了更强大的类型保证。
最好的选择是使用
static_cast<void(*)()>
。它是类型安全的,它可以告诉程序员更多您打算做什么的意图。auto exit = static_cast<void(*)()>(&func);
如果您拥有C++,则可以尝试以下操作:
如果您不想担心类型,请使用
auto
。auto exit = &func
这将确保类型匹配。
如果要检查类型,请使用C++ 11和更高版本中存在的
typeid().name
中的<typeinfo>
:std::cout << typeid(exit).name << std::endl;
尽管这通常会给函数带来一些奇怪的输出,但是您可能会发现一些可以帮助您的信息,最好的一种是两种类型是否不同。
这是一个工作示例,使用函数指针强制转换在运行时显示该问题: http://coliru.stacked-crooked.com/a/47f74e8b6f389812
关于c++ - 强制转换功能指针分配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31524612/