在Windows上運行時,在C++下面這段代碼的工作原理: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中(根據從服務器接收到的格式字符串,這些值可以是從整數到十六進制到char *(又名字符串)及其任意組合的任何值)。
我不知道有多少地點paramsList
傳遞到vsnprintf
,直到我完成根據從服務器接收的格式字符串填充它。所以我需要以某種方式將可變數量的位置從paramsList
傳遞到vsnprintf
或將這些位置轉換爲va_list(我無法知道如何從網上閱讀)。
我還考慮使用可變參數模板和va_list的組合 - 以某種方式將可變數量的位置從paramsList
傳遞給可變參數函數並將它們傳遞給vsnprintf
。但我無法弄清楚如何將給定數組的某些位置傳遞給可變參數函數。
更新:
我使用Visual Studio 2015年在Windows上編譯,並在Ubuntu GCC 4.9。
試圖編譯Linux上的驗證碼,當我得到的錯誤是:error: ISO C++ forbids casting to an array type 'va_list {aka __va_list_tag [1]}'
您是否可以包含您收到的實際錯誤消息?用我們能看到的小代碼來幫助你也很困難。 – Eddge
*此代碼在Windows *上正常工作 - 它可能在創建Windows程序的某個編譯器上「很好」。如果使用其他編譯器或其他版本的相同編譯器,它可能不起作用。 – PaulMcKenzie
只需跟進PaulMcKenzie所說的內容,您是否還可以包含您正在使用的編譯器?所以在Windows和Linux上,你用什麼來編譯你的代碼? – Eddge