2013-06-28 82 views
3

如果我的理解是正確的va_end被稱爲進行清理,並在同樣的背景下,爲va_end手冊頁說,我們可以在不調用va_start的情況下調用va_end嗎?

va_end用來()

的va_start的每次調用()必須由相應的 匹配在相同的函數中調用va_end()。在調用va_end(ap) 之後,變量ap是未定義的。列表的多次遍歷,每個由va_start()和va_end()括起來的 都是可能的。 va_end()可能是一個 宏或函數。

所以這是va_end需求明顯,如果va_start被稱爲被調用,但相反的關係成立,即應通過va_endva_start之前始終?

+2

我爲你添加了[C]標記,因爲'va_end'最初來自C。C++中的可變參數列表的使用非常有限(最好),因爲它們不是類型安全的,類(構造函數等),並有更好的選擇,例如可變模板。 –

+0

簡短的回答,沒有。正如Michael Burr所說的那樣,這是未定義的行爲。有一些實現在va_start/va_end定義的底層使用malloc/free。 –

回答

5

從C99 7.15.1.3/2「的va_end宏」:

如果存在的va_start或va_copy宏沒有相應的調用,或者如果va_end用來宏沒有返回之前調用,行爲未定義。

+1

這實際上回答了這些問題。 – Abhijit

2

不,另一種選擇是va_copy()。他們都需要與va_end()配對。

在其他情況下,這樣做沒有意義。

+1

在其他情況下,行爲未定義(通過省略)。 –

+0

我不確定我是否正確理解你的答案。你的意思是說'va_end'應該在'va_copy'之前,還是沒有這樣的限制,'va_end'可以單獨調用。 – Abhijit

+3

這意味着'va_start()'需要'va_end()'而'va_copy()'需要'va_end()'。在其他情況下,你不需要它。使用它nevertheleass是a)無意義和b)可能調用UB(未定義的行爲)。這意味着任何事情都可能發生(無所謂),數據損壞,程序終止異常。 – glglgl

相關問題