【发布时间】:2013-05-16 05:36:56
【问题描述】:
想看看是否有人知道是否可以交换 C 函数...?
void swap2(int(*a)(int), int(*b)(int)) {
int(*temp)(int) = a;
*a = *b;
*b = temp;
// Gives 'Non-object type 'int (int)' is not assignable
}
swap2(&funcA, &funcB);
编辑
这里有更多关于意图的数据——下面提供了一些答案做工作,例如使用typedef创建函数ptr,将它们指向函数并切换它们,这让你成功调用新交换的ptrs。
BUT 在交换后按其原始名称调用函数显示没有变化。本质上,我正在寻找 objc “swizzle”的 c 等价物。
我开始认为这是不可能的,因为 c 完全没有反射,并且需要实际修改二进制文件本身(显然不可行)。 D:
欢迎评论。
【问题讨论】:
-
*bin*b=temp完全是荒谬。你可以取消引用一个函数指针来调用它。 -
*b不是一个有效的左值开始。 -
@Thokchom -- 虽然该评论似乎主要是批评性的而不是建设性的,但重点仍然是您是正确的。该函数是对用于其他数据类型的通用指针交换的改编,显然是不正确的,因此我的问题首先在这里**见编辑**
-
不,不,你误会我了。我为什么要批评你?我只是在谈论那个作业。我用粗体写了“荒谬”以引起你的注意。干杯! !
-
@MilesAlden 关于编辑部分:能够在运行时交换函数需要运行时决定调用哪个函数。有些语言可能有关于它的语法糖,但它总是归结为对调用什么的某种查找(或在调用函数的每个地方修改二进制文件,这通常甚至被操作系统禁止)。在 C 中,如果你想拥有这个,你需要明确地做到这一点,而函数指针是最直接的方式(但不是唯一的方式)。 IOW,在 C 中,您必须在需要的地方自己实现反射功能。
标签: c pointers function-pointers