【发布时间】:2021-11-30 13:56:57
【问题描述】:
我在 C 语言中针对第三方库(在 HP/Mercury Loadrunner 中)进行编程,该库允许其中一个函数使用 varargs 样式的可变大小参数列表。我想调用这个函数,但我不知道我会有多少参数。
我的一位前辈制作的函数有点作用,但这里的问题是这个函数假设了最坏的情况(超过 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 的常量来标记参数列表的结尾。原始实现不使用它。大概是调用站点..
【问题讨论】:
-
代码损坏:序列点之间 i 和 j 的多次修改。
-
嘿,哇,这是老东西了。
-
对于许多试图回答这个问题的发帖人,请注意 Loadrunner(当时)不支持人们可能习惯的标准 C 的许多细节。值得注意的是:除了 HP 提供的库之外,没有其他库。几乎不支持宏 - 不确定它是否有预处理器。类型定义?可能不是。等等等等。
标签: c