gpt4 book ai didi

C - 具有动态参数数量的调用函数

转载 作者:太空宇宙 更新时间:2023-11-04 04:37:50 24 4
gpt4 key购买 nike

我有一个带有特定数量参数的 C 函数(不是可变参数函数)。例如:

void testfunction(int a, int b, int c);

这个函数是一个黑盒,所以我不能修改它。

在主函数中,我有一个数组,其中包含我想传递给“testfunction”的所有参数。例如:

void main() {
int args[] = {1, 2, 3};
...
}

假设我事先不知道我的“testfunction”将接受多少个参数(因为这个函数可以改变,具体取决于我要测试的函数),我如何调用“testfunction”动态定义数组中的参数?

我有一些 Ruby 经验,这相当于

def test(a, b, c)
...
end
array = [1,2,3]
test(*array)

非常感谢!

最佳答案

好吧,您无法完全达到您想要的效果,但是,如果您对要传输的参数数量有限制,则可以接近。您还将失去某种类型的安全性。方法如下:

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

typedef void (*tf_t)(); // `tf_t` can accept any number of arguments

void tf1(int a) { printf("tf1: %d\n", a); }
void tf2(int a, int b) { printf("tf2: %d, %d\n", a,b); }
void tf3(int a, int b, int c) { printf("tf3: %d, %d, %d\n", a,b,c); }

void call(tf_t tf, int args[], unsigned n)
{
switch (n) {
case 0: tf(); break;
case 1: tf(args[0]); break;
case 2: tf(args[0], args[1]); break;
case 3: tf(args[0], args[1], args[2]); break;
default: puts("Can't handle more than 3 arguments"); abort(); break;
}
}

int main()
{
int args[] = { 1, 2 };
call(tf2, args, sizeof args / sizeof args[0]);
return 0;
}

当然,如果您将 tf3 传递给 call(),它会打印垃圾作为第三个数字,但这是您付出的代价。

原则上,您不应该这样做,因为调用约定可能存在很多问题,但在实践中,它很可能会起作用。

关于C - 具有动态参数数量的调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29304202/

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