当在 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 上运行,但程序崩溃了,因为从 paramsList
到 va_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/