2017-07-19 15 views
0

在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上運行,程序崩潰,因爲paramsListva_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]}'

+0

您是否可以包含您收到的實際錯誤消息?用我們能看到的小代碼來幫助你也很困難。 – Eddge

+1

*此代碼在Windows *上正常工作 - 它可能在創建Windows程序的某個編譯器上「很好」。如果使用其他編譯器或其他版本的相同編譯器,它可能不起作用。 – PaulMcKenzie

+0

只需跟進PaulMcKenzie所說的內容,您是否還可以包含您正在使用的編譯器?所以在Windows和Linux上,你用什麼來編譯你的代碼? – Eddge

回答

1

va_list不確定類型。這意味着它可能是一個void* []或完全其他的東西。

在某些情況下偶然發揮作用,va_list與一個編譯器的特定平臺上的void* []兼容,但這並不表示這是合法的。

不幸的是,正確的處理方法是停止使用printf系列並自己解析格式字符串,沒有標準功能可以訪問和獲取解析後的格式字符串以供自己使用。