gpt4 book ai didi

c - 在 C 中模拟 thiscall 以实现无需自引用的结构函数

转载 作者:太空狗 更新时间:2023-10-29 17:01:35 25 4
gpt4 key购买 nike

这与大量面向对象的 C 帖子有关,但不同之处在于我不想要所有功能,只想要一个:

能够做到这一点:

struct foo { 
int (*bar)(void);
char baz;
};

然后有反向引用。 C有一个称为cdecl的调用约定;基本上将参数压入堆栈,有一个返回指针,然后跳转到某个地址。该地址处的代码从堆栈中弹出参数并继续其愉快的方式。

thiscall 约定略有不同,因为它隐式地添加了一个额外的参数,即“this”指针。

因为你可以很容易地开始在 C 中执行任意字节代码,并且因为 gcc 支持内联汇编程序模板,这听起来你可以只做一些宏,这样你就可以做类似的事情:

int bar(void) {
GETTHIS;
cThis->baz = 0;
}

int createFoo(struct Foo*pFoo) {
ASSIGN(pFoo, bar);
}

基本上,ASSIGN 会做的是以某种方式回避 cdecl 以模拟 thiscall 风格约定,然后 GETTHIS 会做的是会计技巧的另一面。

我想知道是否:

  • 存在对此的解决方案,并且
  • 如果没有,如果有不能完成的原因

仅此而已;真正的“我们在这里都是同意的成年人”风格的成员功能的便利性简直太棒了。谢谢!

注意事项:

  • 我只是在这里谈论 x86、linux、gcc ...我知道世界是一个广阔而陌生的地方。
  • 这是纯粹出于好奇

最佳答案

我的 friend 最终得到了它:https://gist.github.com/1516195 ...需要指定函数 arity 并且仅限于 x86_64 ...但是,是的,这是一个非常好的折衷方案,让事情变得非常不引人注目。

关于c - 在 C 中模拟 thiscall 以实现无需自引用的结构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8609808/

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