c++ - va_start 作为数组

标签 c++

根据我对 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/

相关文章:

c++ - 使用 CUDA 7.0/VS2012 C++/CLI/OpenCV 的多线程 CPU 到 GPU

c++ - 使用 ofstream 写入带有临时缓冲区的文件

c# - 字节公因数

c++ - 访问共享库中定义的单例

c++ - SQLite 与 Android NDK

c++ - 汇编中的动态调度是如何发生的?

c++ - 根据对象元素将相似对象合并在一起的时间复杂度为 O(n²)。如何让它变得更简单?

c++ - 模板成员变量的值

c# - Silverlight 中动态加载的程序集调用锁定文件的 DllImprot

c++ - "} while (0);"总是等于 "break;} while (1);"吗?