gpt4 book ai didi

动态调用带有 varargs 参数的 C 函数

转载 作者:太空狗 更新时间:2023-10-29 16:33:39 26 4
gpt4 key购买 nike

我正在针对第三方库(在 HP/Mercury Loadrunner 中)使用 C 语言进行编程,该库允许其中一个函数使用可变参数样式的可变大小参数列表。我想调用这个函数,但我事先不知道我会有多少参数。

我的一位前任创建了一个函数,它在一定程度上起到了作用,但这里的问题是该函数假设了最坏的情况(超过 3000 个参数)并为此手动编写了代码。

为了说明,这里是代码的(开头)。我们调用的函数是 web_submit_data()。它将 HTTP 发布一组表单数据。这种实现是在处理具有任意数量字段的动态生成的表单时出现的。(从原始文件中清理了相当多的内容,原始文件也手动编码索引..)


web_submit_data_buffer_gazillion_items( const char *bufferName, const char *bufferValue)
{
const int size = 129;
int i = 0;
int j = 11;

web_submit_data(&bufferName[i++ * size], //"some form"
&bufferName[i++ * size], //"Action=https://blah.blah/form");
&bufferName[i++ * size], //"Method=POST");
&bufferName[i++ * size], //"TargetFrame=");
&bufferName[i++ * size], //"RecContentType=text/html");
&bufferName[i++ * size], //"Referer=https://blah.blah/index.html");
&bufferName[i++ * size], //"Snapshot=t1.inf");
&bufferName[i++ * size], //"Mode=HTML");
ITEMDATA, // missing in action: indexes 8 through 10
&bufferName[j * size],&bufferValue[j++ * size], ENDITEM,
&bufferName[j * size],&bufferValue[j++ * size], ENDITEM,
&bufferName[j * size],&bufferValue[j++ * size], ENDITEM,
..
(repeat the last 3 lines ad nauseum)
..
&bufferName[j * size],&bufferValue[j++ * size], ENDITEM,
&bufferName[j * size]);
}

现在我找到了一个可能工作的外部库(http://www.dyncall.org),但我宁愿不 a) 完全依赖处理器和 b) 尝试教 Loadrunner 如何链接外部源..

编辑:原始函数使用硬编码索引而不是使用变量。如果结果太不可预测,仍然可以恢复到那个状态。但是,由于我不太可能使用不同的编译器或硬件/操作系统来运行它,我怀疑这是否真的值得。

另外:我无法控制 web_submit_data() 的实现。因此,仅仅将问题推低一级并不能解决问题。

另一件需要注意的事情:web_submit_data() 的规范使用一个名为 LAST 的常量来标记参数列表的结尾。原始实现不使用它。大概调用站点确实..

最佳答案

在 CamelBones 中我使用 libffi调用 objc_msgSend(),这是一个可变参数函数。效果很好。

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

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