[英]How can I decay const char that is passed as reference to a function with variadic parameters?
[英]variadic function - how to ensure parameters passed correctly
有沒有辦法(內置或代碼模式)確保可變參數傳遞正確數量的參數? (顯然,這將作為API的一部分包含在內,我可以查看自己的內部代碼。)
我正在考慮要求UN32 Magic Number成為傳遞的最后一個參數,並檢查可變參數函數的有效性。 有沒有人對此有任何想法?
va_*
宏只是彈出本地堆棧中的變量,因此您必須信任該用戶。 我認為,傳遞數組/大小元組可能更安全。
在C或C ++中沒有確定的方法來確保將正確數量的參數傳遞給可變參數函數。 即使需要簽名也不能保證工作,因為它可能與有效參數的值沖突。 傳遞矢量<>可能會好得多,因為檢索的元素數是准確的。
您可以使用PP_NARG宏半自動添加計數。
int myfunc (int count, ...);
#define MYFUNC(...) myfunc(PP_NARG(__VA_ARGS__), __VA_ARGS__)
MYFUNC(a,b,c,d);
MYFUNC(a,b,c,d,e,f,g);
gcc -E產生:
int myfunc (int count, ...);
myfunc(4, a,b,c,d);
myfunc(7, a,b,c,d,e,f,g);
難道你不能使用應用於函數的C ++ 0x的可變參數模板功能嗎? 這將生成類型安全的vararg函數。
使用可變參數模板化函數查看此鏈接的類型安全printf實現
http://www2.research.att.com/~bs/C++0xFAQ.html#variadic-templates
這取決於你的意思是“確保可變參數傳遞正確數量的參數”......
傳遞UN32 Magic Number作為最后一個參數將允許您確定參數列表的結束位置,以及它們的總數。 所以,通過計算你在UN32之前找到多少個參數,你知道你有多少參數,你的函數應該知道它是否足夠。 不知道你是否可以在運行時確定這一點(可能為時已晚)......
無論如何,通常可變函數有一個固定的參數列表部分代表強制參數(至少一個); 所以這應該是你確保函數獲得正確數量的參數的方式...
不,不可能。
Variadic以無法修復的方式打破了類型安全。
如果你想要返回類型安全性,那么考慮將可變參數函數分解為[small]類的幾個類型安全成員函數,該函數保存它們的調用之間的共享狀態。
這總是可行的,即使多次調用與單個可變參數調用相比可能看起來很尷尬。
共享狀態可能是您首先需要可變參數功能的原因。
以iostream vs printf為例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.