【发布时间】:2011-12-22 21:16:54
【问题描述】:
这与大量面向对象的 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……我知道世界是一个广阔而陌生的地方。
- 这纯粹出于好奇。
【问题讨论】:
-
通常你只需要声明函数接受一个不透明(空指针)的第一个参数,当传递一个函数指针到某个库/对象以便它回调你时,你传递一个指向 一些东西在你身边;当对象调用你的函数时,它会传递这个指针,你的函数会识别 something (在从 void 指针转换之后)。
-
为什么要这个?如果您需要一种具有成员函数但没有虚函数、异常等开销的类 C 语言,您可以只使用 C++ 并禁止使用慢速特性和 STL。这在嵌入式世界中很常见。
-
@Crashworks,解除 Torvalds 自传的标题,“只是为了好玩”
标签: c oop assembly compiler-construction