回答
va_list
可能(但不能保證)是一個數組類型,所以您無法按值傳遞或返回它。看起來好像它的代碼可能只是傳遞/返回指向第一個元素的指針,所以您可以在被調用者中使用該參數,但是您可能會在原始代碼上執行該操作。
形式上你可以說va_list
是一個實體類型,而不是一個值類型。您將其複製爲va_copy
,而不是通過賦值或通過函數參數/返回。
雖然你絕對可以return
這樣一個值,我不知道是否可以用有用的方式使用返回值。
由於va_list
S上的處理需要特殊處理(va_start()
和va_copy()
後需要va_end()
),以及va_start/copy
和va_end
宏甚至允許包含{ }
執行這一配對,你不能說一個沒有其他。
'va_copy'用於創建* second *'va_list'對象,該對象可以獨立於原始對象進行讀取。由於這不是這種情況,所以我會說可以傳遞並返回'va_list'對象。此外,該標準沒有提到'va_start()'和'va_end()'必須在同一個範圍內,因此我不知道它們如何被允許包含'{':es。 – Lindydancer
@Lindydancer哦,不知道。 [Here](http://linux.die.net/man/3/va_start)我讀到「每次調用va_start()都必須匹配va_end()在相同函數中的相應調用」和「每次調用va_copy()必須在相同的函數中匹配va_end()的相應調用。「,所以我認爲它是從標準錐... – glglgl
@glglgl:」在同一個函數中「並不一定意味着」在同樣的範圍「,所以並不意味着宏可以使用不匹配的大括號。但它確實允許'va_copy'使用像'alloca'這樣的技巧,因爲新列表不會超出函數返回的範圍。 –
無論語言標準如何,這在實踐中都不太可能發揮作用。 A va_list
很可能是指向由呼叫者放置在堆棧上的呼叫記錄的指針,以便爲被呼叫者帶來利益。一旦被調用者返回,堆棧中的內存是公平的遊戲以供重用。
返回類型va_list
不太可能實際上將列表內容複製回調用者。儘管這將是C的有效實現,但如果標準要求這樣做,那麼這將成爲規範中的缺陷。
「va_end」宏存在的原因正是因爲'va_list'不一定只是指向堆棧上的某個指針。否則,'va_end'將永遠是空操作。存在'va_list'對象在堆上分配的實現。 –
@DietrichEpp好信息,我以爲'va_end'有一些註冊窗口或舊的實現,只允許一次迭代器。調整了我的答案,但這只是一個相對重點問題......大多數架構不會使用可變參數堆。 – Potatoswatter
傳遞指向另一個函數的指針與返回該指針的 完全不同。許多/大多數實現將 實際變量參數存儲在棧幀中,該棧幀在可變參數函數返回時被破壞。 (即返回一個va_list或一個指向 的指針,會給你指向局部變量的指針,這些指針被破壞) 。 - 第
在我的情況好,我會爲警告返回的va_list回來,但感謝 - Hayri維吾爾族如果你傳遞一個指向
va_list
的功能MyFunc(va_list *args)
Koltuk
,你不需要將修改後的(由va_arg(*args, type)
)參數列表傳回,因爲MyFunc
修改了原始列表。
- 1. C++ va_list返回奇數值
- 2. C#安全地返回字典引用
- 3. drand48全部返回0嗎? (C)
- 4. C/C++ va_list沒有正確返回參數
- 5. 在C#中的方法中返回FileStream是否安全?
- 6. C/C++的va_list
- 7. 這是[0]在C++中安全嗎?
- 8. 在C#中有像C++一樣的指針嗎?它安全嗎?
- 9. 返回流是否安全?
- 10. 從正在返回的界面投射?它總是安全嗎?
- 11. C#+ =線程安全嗎?
- 12. 在C++中新返回(void *)嗎?
- 13. va_list的在C++ 64位
- 14. console.time()在node.js中安全嗎?
- 15. parseFloat在JavaScript中安全嗎?
- 16. C中的Fopen/fread/fgets PID安全嗎?
- 17. 是C#中的CreateDirectory()線程安全嗎?
- 18. 從靜態方法返回一個引用線程安全嗎?
- 19. 將_beginthread返回的uintptr_t強制轉換爲HANDLE安全嗎?
- 20. 使用Facebook API請求返回的錯誤代碼安全嗎?
- 21. 一種方法返回Stream <T>安全嗎?
- 22. 這是從SQL注入返回DataTable安全的方法嗎?
- 23. 從函數返回一個QString - 線程安全嗎?
- 24. 返回std :: map值的地址是安全的嗎?
- 25. 在C#在C++中,指針的簡單迴歸安全/參考
- 26. 鉤。 va_list .is可能嗎?
- 27. 在易發生異常的代碼中使用va_list是否安全?
- 28. 是codeigniter驗證回調安全嗎?
- 29. 如何在C++中以DLL安全的方式返回多個值?
- 30. c#中的FLWOR XQuery返回空嗎?
如果你的意圖是傳入'va_list',修改它,然後在函數返回時使用修改過的'va_list',最好考慮將指向'va_list'的指針傳遞給'MyFunct() '並通過指針使其在列表上起作用。該標準特別提到腳註允許使用該技術。 –
這正是我的意圖。你能指出標準的地方嗎? –
在我看來,'va_list'是一個壞主意。通常有更好的解決方案更安全。所以我會認真思考,併爲該功能的設計和實現提供更好的解決方案。 –