gpt4 book ai didi

c++ - 在函数指针赋值中强制转换

转载 作者:太空狗 更新时间:2023-10-29 23:32:43 25 4
gpt4 key购买 nike

下面的函数指针是怎么赋值的:

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

这将确保类型匹配。如果要检查类型,请使用 typeid().name来自 <typeinfo>它存在于 C++11 及更高版本中:

std::cout << typeid(exit).name << std::endl;

虽然这通常会为函数提供一些奇怪的输出,但您可能会找到一些可以帮助您的信息,最好的信息是这两种类型是否不同。

这是一个工作示例,显示了运行时函数指针转换的问题: http://coliru.stacked-crooked.com/a/47f74e8b6f389812

关于c++ - 在函数指针赋值中强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31524612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com