gpt4 book ai didi

c - 功能指针,设计

转载 作者:行者123 更新时间:2023-12-02 04:01:45 24 4
gpt4 key购买 nike

我遇到了 C 中的设计问题。

假设我有相当多的函数,具有不同的参数计数。

问题:

int print_one(int x)
{
printf("one: %d\n", x);
return 1;
}

int print_three(int x, int y, int z)
{
printf("three: %d-%d-%d\n", x, y, z);
return 3;
}

现在,我想将一些属性连接到结构中的这些函数,这样我就可以在不知道确切函数的情况下操作它们,包括它们的参数计数(我什至可以调用结构接口(interface))

我像这样尝试过,(我认为这是非常错误的):
typedef int (*pfunc)(int c, ...);

typedef struct _stroffunc
{
pfunc myfunction;
int flags;
int some_thing_count;
int arguments[10];
int argumentcount;
} stroffunc;

int main()
{
stroffunc firststruct;

firststruct.pfunc = (pfunc) print_two;
firststruct.something_count = 101;
arguments[0] = 102;
argumentcount = 1;
flag &= SOME_SEXY_FLAG;

// now I can call it, in a pretty ugly way ... however I want (with patially random results ofc)
firststruct.pfunc(firststruct.arguments[0]);
firststruct.pfunc(firststruct.arguments[0], 124, 11);
firststruct.pfunc(1, firststruct.arguments[0], 124, 1, 1);
}

我发现这个解决方案非常难看,我认为(希望)有一个更好的解决方案来调用 & 和设置函数指针。

我只是希望,我已经足够清楚了......
注意:我没有编译这段代码,但我编译并运行了一个非常相似的代码,所以这些概念是有效的。
注意:需要纯 C

最佳答案

通过可变参数函数指针调用非可变参数函数会导致 未定义的行为 .首先,回想一下可变参数函数的参数经过默认参数提升(char s 转换为 int s 等​​),这将完全搞砸。

目前尚不清楚您打算如何或为什么要动态调用具有不同数量参数的函数。但一种解决方案可能是使用 union :

typedef struct {
int num_args;
union {
void (*f1)(int);
void (*f2)(int, int);
void (*f3)(int, int, int);
} func;
} magic;


...

magic m;
...
switch (m.num_args) {
case 1: m.func.f1(arg1); break;
case 2: m.func.f2(arg1, arg2); break;
case 3: m.func.f3(arg1, arg2, arg3); break;
default: assert(0);
}

第二种解决方案是将所有函数重写为可变参数。

关于c - 功能指针,设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10180607/

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