gpt4 book ai didi

c - 如何优雅地构造在 C 中迭代数组的长参数列表

转载 作者:行者123 更新时间:2023-11-30 18:55:58 25 4
gpt4 key购买 nike

我有一个接受可变参数的 C 函数,我需要使用一个很长的参数列表来调用它,其中参数都遍历数组的元素。示例:

myFunction( A[0], B[0], A[1], B[1], A[2], B[2], A[3], B[3], ..... A[N], B[N] );

其中 N 通常为 100-200。

我宁愿不必每次使 N 变大时都手动构建此调用,并开始思考,是否有一种优雅的方法可以做到这一点?

我尝试过类似的方法:

i=0;
myFunction( A[i], B[i++], A[i], B[i++], A[i], B[i++], A[i], B[i++], ..... A[i], B[++] );

但这当然失败了。然而,它的优点是,每当我使 N 变大时,我都可以简单地一遍又一遍地复制同一行,而不必确保每个数组索引都是正确的,这非常乏味。

更改 myFunction() 不是一个选项。

我希望 C 有一种方法可以动态构造函数调用,例如:

for( i = 0 ; i <= N ; i++ )
{
CONSTRUCT_CALL( myFunction, A[i], B[i] );
}

这正是我想要的,但这当然不是一个选择。

有什么可以更简单或更优雅的吗?

非常感谢。

最佳答案

没有标准的 C 方法可以做到这一点(在运行时合成可变参数调用)。但是...

  • 您可以使用libffi它旨在处理此类问题(所以我推荐它)
  • 您可以考虑 GCC 特定的 Builtins for Constructing Calls
  • 您可以对数量有一些固定的限制(例如 500),并使用某些(shell、awk、Python、...)脚本执行 switch 500 个案例,每个案例一个。
  • 您可能会考虑在运行时生成一些C代码到_gen123.c中,将其编译成动态可加载插件(例如 fork 一些gcc -shared -fPIC -Wall -O _gen123.c -o _gen123.so 命令(Linux 上),然后加载该插件(在 Linux 或 Posix 上使用 dlopen(3))
  • 您可能会考虑一些just-in-time compilation库(例如 libjitllvm 、GNU lightningasmjit 、...)

当然,避免在一次调用中出现多个i++。避免undefined behavior ,自 bad things可能会发生。

关于c - 如何优雅地构造在 C 中迭代数组的长参数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25868208/

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