gpt4 book ai didi

c - 是否可以交换 C 函数?

转载 作者:太空狗 更新时间:2023-10-29 15:13:14 26 4
gpt4 key购买 nike

想看看是否有人知道是否可以交换 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。

但是 交换后按原始名称调用函数显示没有变化。本质上,我正在寻找与 objc“swizzle”等效的 c。

我开始认为这是不可能的,因为 c 完全没有反射,并且需要实际修改二进制文件本身(显然不可行)。 D:

欢迎评论。

最佳答案

如果你像下面这样使用函数指针,是的

typedef int (*func_pt)(int);

func_pt a, b;

void swap(func_pt * a, func_pt * b)
{
func_pt tmp = *b;
*b = *a;
*a = tmp;
}

swap(&a, &b);

或者你这么用,我觉得是不行的:

int test1(int a)
{
return a;
}

int test2(int b)
{
return b;
}

swap(&test1, &test2);

完成编译工作程序

#include <stdio.h>
#include <stdlib.h>

typedef int (* func_pt)(int);

func_pt a, b;

int test1(int a)
{
printf("test1\n");
return 1;
}

int test2(int a)
{
printf("test2\n");
return 2;
}

void swap(func_pt * a, func_pt * b)
{
func_pt tmp = *b;

*b = *a;
*a = tmp;
}

int main(void)
{
a = &test1;
b = &test2;

printf("before\n");
a(1);
b(1);

swap(&a, &b);

printf("after\n");
a(1);
b(2);

return 0;

}

输出:

before
test1
test2
after
test2
test1

有些人自己不去尝试,就说很荒唐。所以我举个例子。

关于c - 是否可以交换 C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16579688/

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