簡體   English   中英

可變功能 - 如何確保參數正確傳遞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM