gpt4 book ai didi

c++ - va_start 作为数组

转载 作者:太空宇宙 更新时间:2023-11-04 12:06:52 25 4
gpt4 key购买 nike

根据我对 va_arg 宏的了解,它检索参数列表指向的下一个参数。有什么方法可以选择我想要获取的参数的索引,比如数组索引?

例如,我需要执行一个操作,我需要至少调用 3 次 va_arg 宏,但我希望这 3 次检索相同的参数,而不是列表中的下一个。一种解决方案可能是使用函数并传递参数,但我不希望那样。

此外,如果没有其他宏可以执行此操作,我如何通过指针引用数组参数的开头?我知道它不便携,不安全等等。只是为了学习。

下面是我想如何实现它的示例代码:

bool SQLBase::BindQuery (char* query, int NumArgs, ...) 
{
va_list argList;
va_start(argList, NumArgs);
SQLPrepare (hstmt, query, SQL_NTS);
for (int x = 0; x < NumArgs; x++)
{
SQLBindParameter (hstmt, (x+1), GetTypeParameter (va_arg(argList, SQLPOINTER*), SQL_C_CHAR, SQL_CHAR, 10, 0, va_arg(argList, SQLPOINTER*), va_arg(argList, SQLLEN), &recvsize[x]);
}

SQLBindParameter 函数调用 va_arg 3 次,我希望前 2 次指向同一个参数,而不是增加参数列表中的计数成员。

最佳答案

首先,在您的函数调用中多次调用 va_arg 很麻烦,因为您不知道这些调用的发生顺序。您需要事先执行此操作,以便以正确的顺序检索您的参数。

其次,没有:没有数组风格的用法auf va_list。这是因为 va_list 对栈上的参数一无所知;您在 va_arg 调用中提供了类型,然后 va_arg 可以增加 va_list 中包含的(内部/概念)指针,因为它知道该参数的大小。要获得第三个参数,您需要提供前两个参数的类型。

如果所有的参数都是相同的大小(比如“void*”),你总是可以做一个循环来调用 va_arg 适当的次数。如果您可以合理地确定您的论点实际上是相同的大小,那么这就是“某种”可移植的。不过,我不太相信这样做是最好的做法——这样做的必要性可能表明不同的设置会更合适,比如首先传递一个数组而不是使用变量参数功能。

您也可以只获取函数参数的地址,并假设它们以某种顺序位于堆栈中。这是非常不可移植的,因为您需要了解调用约定,这些约定可能因编译器而异,甚至可能根据编译选项而改变。我绝对会建议不要做这样的事情。

关于c++ - va_start 作为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11698842/

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