gpt4 book ai didi

将函数指针转换为接受更多参数的类型

转载 作者:太空狗 更新时间:2023-10-29 15:51:18 24 4
gpt4 key购买 nike

据我所知,在不兼容的函数指针之间进行转换,例如:

void aUnaryFunction(int a1)
{
/* .... */
}

void doSomethingWithFn()
{
typedef void(*BinaryFn)(int, const char*);
BinaryFn aBinaryFunction = (BinaryFn) &aUnaryFunction;
aBinaryFunction (3, "!!!");
}

永远不应该这样做,因为根据 C 标准,这是“未定义的行为”。

但是我不明白为什么,考虑到函数调用在 C 中的工作方式,这个例子是不安全的。我所做的只是无视争论。

假设对 int 第一个参数的处理是一致的,所有会发生的是当 doSomethingWithFn() 调用 aBinaryFunction 时,const char* 将被放入一个寄存器中>,aUnaryFunction 将按预期运行,const char* 可能会在 aUnaryFunction 期间被覆盖,但这没关系,因为无论如何都不会使用它。

我是不是遗漏了什么,或者这实际上是安全的吗?(或者介于两者之间,或两者兼而有之?)

最佳答案

问题是没有一个“函数调用在 C 中工作的方式” - 只有函数调用在特定 C 实现上工作的方式。

作为一个具体的例子,“被调用者清理”调用约定(如 x86 stdcall)要求被调用者知道有多少参数被压入堆栈以执行正确的清理,这将在你的例子中被颠覆。

关于将函数指针转换为接受更多参数的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6265857/

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