c - C的一个小问题

标签 c variadic-functions

我想实现一个参数数量可变的函数。此函数允许我使用可选参数列表调用另一个函数。这个函数的目的是根据某些条件调用任何函数(取决于被调用的函数,如果两个第一个参数相等,我们调用该函数)。我的问题是,可以调用的函数没有相同数量的参数,因此,每次我有不同的函数时,我都不知道如何传递参数

例如,如果我有这个:

void func(int value_to_compare, int compared_value, int arg_number, char *arg_types, char *function_name, ...)

我可以这样调用它:

char arg1;
int arg2, arg3;
int condition1;

func(condition1, 1, 1, "c", func1, arg1);
func(condition1, 0, 2, "ci", func2, arg1, arg2);
func(arg2, 0 , 3, "cii", func3, arg1, arg2, arg3);

调用的函数如下:

func1(char);
func2(char, int);
func3(char, int, int);

我尝试解释更多,例如:

struct element_list {
char *element_type;
char *element_name;
}

在我的例子中,结构有大量元素,条件必须作为参数传递给函数,条件值取决于上下文,所以我必须能够在任何上下文中调用“func” ,我只是给出条件和值,然后一个函数将用相应的参数调用,所以它会是这样的

func(element_list.element_type, "CHAR", func1, "s", element_list.element_name);

除此之外,我还有大量的函数和大量的条件,所以我需要尽可能通用的东西。

最佳答案

无论您在做什么,现在您都在围绕类型系统工作。在 C 中没有类型安全的方式来做您想做的事情。

牢记这一点:

一个可能的解决方案是使所有这些函数成为同一类型:typedef void my_func_type(void*) 并让每个函数自行“解密”参数。

另一种解决方案是重新考虑您的设计 - 这是我真诚推荐给您的解决方案。但首先你需要多说一点你想在这里实现的目标......一个好的起点是展示你打算如何使用这些功能。很可能你最终根本不需要这个......


继续,#1

据我了解,您希望编写这样的 func 这段代码

char arg1;
int arg2, arg3;
int condition1;

func(condition1, 1, 1, "c", func1, arg1);
func(condition1, 0, 2, "ci", func2, arg1, arg2);
func(arg2, 0 , 3, "cii", func3, arg1, arg2, arg3);

会表现得像:

if (condition1 == 1) func1(arg1);
if (condition1 == 0) func2(arg1, arg2);
if (arg2 == 0)       func3(arg1, arg2, arg3);

说实话...最好的方法就是这样写。 :-)

既然您要问这个问题,您可能想要更复杂的问题。情况是这样的:您想对代码的控制流构建一些抽象。这就是函数式编程风格派上用场的地方......事实上,在 C++ 中,事情会很简单(好吧,不是真的微不足道,但可以以类型安全和可移植的方式完成,有一些模板魔术奇怪的功能在他们的名字中绑定(bind))。

我们谈论的是 C 而不是 C++,没有模板,没有仿函数……所以事情可能比这更复杂。但首先要做的是 - 是什么阻止您使用带有 if 的简单解决方案?回答这个问题是一个好的开始。

关于c - C的一个小问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6290246/

相关文章:

c - 警告 : control reaches end of non-void function; error: null undeclared (c)

c - 使文件在所有节点上可用

c - 如何找到共享库符号的绝对地址?

c++ - 可变参数函数在编译时接受相同类型的参数并对其进行迭代

java - 变量参数(varargs)java用法

c - 如何区分 RTOS 和 Linux?

c - 获取 Dev-C++ 构建的程序以将 UNICODE 字符输出到 Windows 命令行

c - 可变参数函数无法正确解析参数

未传递参数或 null 时的 Java 3 点参数 (varargs) 行为

java - 如何将字符串数组和字符串作为可变参数传递?