C++将可变数量的位置从给定数组传递给函数

标签 c++ string variadic-functions

当在 Windows 上运行时,以下代码在 C++ 中有效:

void* paramsList[MAX_PARAMS_NUM] = { 0 };

...some code to populate paramsList (p.s MAX_PARAMS_NUM is a constant)

vsnprintf((char*)pStr, MAXLEN, (char*)pTempFormat, (va_list)paramsList);

这段代码在 Windows 上运行良好,但我试图让它在 Linux 上运行,但程序崩溃了,因为从 paramsListva_list 的转换在那里不起作用.

现在这个场景的设置是我从我无法控制的服务器获取格式字符串。格式字符串 ('pTempFormat') 就像在 printf 中使用的字符串,其中 % 的数量未知(最大值为 MAX_PARAMS_NUM),我相应地填充了 paramsList,然后我使用 vsnprintf 从我得到的格式字符串和 paramsList 中填充的值创建一个字符串。(根据从服务器)。

我不知道有多少位置 paramsList 传递给 vsnprintf 直到我根据从服务器接收到的格式字符串完成填充它。所以我需要以某种方式将可变数量的位置从 paramsList 传递到 vsnprintf 或将这些位置转换为 va_list(我不知道该怎么做我在线阅读)。

我还考虑过使用可变参数模板和 va_list 的组合 - 以某种方式将可变数量的位置从 paramsList 传递给可变参数函数,并将它们传递给 vsnprintf .但是我也不知道如何将给定数组中的某些位置传递给可变参数函数。

更新:

我在 Windows 上使用 Visual Studio 2015 进行编译,在 Ubuntu 上使用 GCC 4.9。

我在 Linux 上尝试编译此代码时遇到的错误是:error: ISO C++ forbids casting to an array type 'va_list {aka __va_list_tag [1]}'

最佳答案

va_list 是一个未指定 类型。这意味着它可能是 void* [] 或完全不同的东西。

它在某些情况下偶然起作用只是 va_list 在一个编译器的特定平台上与 void* [] 兼容,这绝不是指示这是合法的。

不幸的是,处理这个问题的正确方法是停止使用 printf 系列并自己解析格式字符串,没有标准功能可以访问并获取已解析的格式字符串以供使用为你自己。

关于C++将可变数量的位置从给定数组传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45195779/

相关文章:

iphone - 如何从格式和 va_list 中获取格式化的 NSString?

c++ - 将 STL 算法与 shared_ptr、函数对象一起使用

c++ - 将字符串转换为 GUID 不会给出正确的结果

c++ - 为什么会有定义_tmain 的宏?

c - 为什么这个程序在使用大字符串时不能给出正确的结果?

C 中用指针改变字符串的值

C# 字符串操作生成字符串列表

c++ - 为什么thread_local不能应用于非静态数据成员以及如何实现线程局部非静态数据成员?

c - 使用 va_list 和 va_arg 实现子函数

c++ - 我可以引用 va_start() 吗?