可以在C中具有不變引數的可變函式嗎?
我有以下功能:
void doStuff(int unusedParameter, ...) { va_list params; va_start(params, unusedParameter); /* ... */ va_end(params); }
作為重構的一部分,我想刪除未使用的引數,而不改變函式的實現.據我所知,當您沒有最後一個不可變引數來引用時,不可能使用va_start.有沒有辦法解決?
背景:實際上是一個C程式,所以我可以使用一些操作符超載魔術,如建議ofollow,noindex" target="_blank">here ,但我希望在這一點上不必改變介面.
現有函式通過要求變數引數列表為空終止,並掃描NULL,因此它不需要一個前導引數來告訴它有多少個引數,因此它的工作.
響應評論:我不必刪除未使用的引數,但如果有一個乾淨的方法,我會做到這一點.我希望有一些我會想念的東西.
您的選擇是將它保留為原樣,並使用va_list,別名(如果是GCC),如其他人指出的那樣,或者做一些沿著exec(2)介面的行 – 傳遞一個需要NULL終止符的指標陣列:
/* \param argsNULL-terminated array of *pointers to arguments. */ void doStuff( void* args[] );
無論哪種方式,重構介面將以更好的方式利用型別系統 – 也許過載所使用的精確引數型別:
void doStuff( int ); void doStuff( const std::string& ); void doStuff( const MyFancyAppClass& );
希望這可以幫助.
程式碼日誌版權宣告:
翻譯自:http://stackoverflow.com/questions/2622147/is-it-possible-to-have-a-variadic-function-in-c-with-no-non-variadic-parameter