Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当使用可变长度参数列表(…)时,除了通过va_列表前进外,您还能做什么?_C++ - Fatal编程技术网

C++ 当使用可变长度参数列表(…)时,除了通过va_列表前进外,您还能做什么?

C++ 当使用可变长度参数列表(…)时,除了通过va_列表前进外,您还能做什么?,c++,C++,如果每次调用va_arg都会修改使用va_list声明的对象,使该对象指向列表中的下一个参数,那么有没有办法后退一步,使其指向上一个参数、跳回到第一个参数、跳到最后一个参数?用四分之三的时间浏览列表,然后。。。你明白了。或者它是一个一次通过即消失的类型吗?您可以通过再次执行va_start跳回开始。除了继续下一个参数外,没有其他受支持的操作 然而,大多数实现都使用简单的指针算法。如果您保证代码只在特定的体系结构上运行,那么您可以执行与算法相反的操作。但是这完全违背了va_list的目的,即安全地

如果每次调用va_arg都会修改使用va_list声明的对象,使该对象指向列表中的下一个参数,那么有没有办法后退一步,使其指向上一个参数、跳回到第一个参数、跳到最后一个参数?用四分之三的时间浏览列表,然后。。。你明白了。或者它是一个一次通过即消失的类型吗?

您可以通过再次执行va_start跳回开始。除了继续下一个参数外,没有其他受支持的操作


然而,大多数实现都使用简单的指针算法。如果您保证代码只在特定的体系结构上运行,那么您可以执行与算法相反的操作。但是这完全违背了va_list的目的,即安全地抽象所有体系结构的操作。

您可以通过再次执行va_start返回到开始。除了继续下一个参数外,没有其他受支持的操作


然而,大多数实现都使用简单的指针算法。如果您保证代码只在特定的体系结构上运行,那么您可以执行与算法相反的操作。但这完全违背了va_列表的目的,即安全地抽象所有体系结构的操作。

使用C99,您可以使用va_副本保存va_列表的状态,允许您多次单步查看列表的一部分。

使用C99,您可以使用va_副本保存va_列表的状态,允许您多次单步浏览列表的一部分。

您只需要有创造性。变量参数列表结构依赖于平台,但元素始终存储在数组中。在大多数x86平台上,va_列表是由64位块组成的数组。这意味着您可以获取指向va_列表中第一个元素的指针,将其强制转换为四字指针,然后以您选择的任何方式逐步遍历列表


我曾经使用这种策略来解析一个va_列表,我们将其传递到一个中间件库中,该库要求所有字符串数据都是unicode格式的。本质上,我用一个指针指向va_列表的第一个元素,遍历每个元素,直到找到一个字符串,然后转换字符串。然后我把清单传给了图书馆。

你只要有创意就行了。变量参数列表结构依赖于平台,但元素始终存储在数组中。在大多数x86平台上,va_列表是由64位块组成的数组。这意味着您可以获取指向va_列表中第一个元素的指针,将其强制转换为四字指针,然后以您选择的任何方式逐步遍历列表


我曾经使用这种策略来解析一个va_列表,我们将其传递到一个中间件库中,该库要求所有字符串数据都是unicode格式的。本质上,我用一个指针指向va_列表的第一个元素,遍历每个元素,直到找到一个字符串,然后转换字符串。然后我将va_列表传递到库中。

您在做什么,需要可变长度参数?我个人觉得它们毫无用处。仅限于几种基本数据类型以及使用/访问它们的方式


相反,只传递包含所需数据的结构/类可能更容易、更安全。

您在做什么,需要可变长度参数?我个人觉得它们毫无用处。仅限于几种基本数据类型以及使用/访问它们的方式


相反,只传递包含所需数据的结构/类可能更容易、更安全。

大多数x86平台仍然是32位的。没错,但va_列表的实现适合最大的固有类型,即双精度。在大多数x86平台上是64位。sizeofdouble==8。大多数x86平台仍然是32位的。True,但va_列表的实现适合最大的内在类型,即double。在大多数x86平台上是64位。sizeofdouble==8。请注意,va_start可能在某些平台上执行一些奇怪的操作,因此在再次使用va_start之前,应始终使用va_end进行清理。实现可以自由地以他们认为合适的任何方式实现这些,虽然宏很常见,但它们可能不是这样。谢谢,这个答案让我对我所寻求的有了更深的理解,也感谢greyfade关于va_endNote的额外说明,va_start可能在某些平台上做了一些奇怪的事情,因此,在再次使用va_start之前,应始终使用va_end进行清理。实现可以随意实现它们,而宏是常见的,它们可能不太好。谢谢,这个答案让我更深刻地理解了,我在寻找,也感谢GrayFlash,关于VAYEnter的额外注释,实际上我只是在做一个叫做“读取我的C++书”的东西,再加上我的编译器和StAdvOp溢出,我把这种组合称为:学习:如果他们真的很得体地实施它们,或者有足够的经验,就不会那么糟糕
一种识别和存储类类型的方法。这很好,Ryan,只是想让您知道在变量参数列表中有更好的方法可以使用。@user230821所以请避免使用printf。你是说它“毫无用处”吗?当然,有一些情况下,可变长度的ARG是解决问题的最佳方案。实际上,我只是在做一个叫做“读取我的C++书”的东西,再加上我的编译器和StAdvOp溢出,我把这种组合称为:学习:如果他们真正恰当地实现它们,或者有一种方法来识别和存储类类型,它们就不会那么糟糕了。这很好,Ryan,只是想让您知道在变量参数列表中有更好的方法可以使用。@user230821所以请避免使用printf。你是说它“毫无用处”吗?在一些情况下,变长args是问题的最佳解决方案,这是不争的事实。