2014-04-01 73 views
1

我剛剛在C中發現了可變參數函數,並將其定義爲一般通知typedef,以及指向文本字符串的指針可以隨意地將任何參數與它作爲一個通用的調試函數是有用的,例如我希望在一個地方對所有的輸出字符串進行操作。在可變參數中包含可變參數

因爲我希望我的C文件儘可能通用,所以我有靜態變量,它包含指向較高代碼中可能的回調的指針,並在init調用中填充。由於指針可能爲空,如果較高的代碼不感興趣,我通常會有一個本地包裝,只有通過指針調用,如果它不是null。但是我很難找出如何轉發這個由'...'表示的模糊事物,並且只是在參數列表中用'...'調用該函數會給出語法錯誤。

有沒有辦法做到這一點,或者我堅持有一個虛擬的本地處理程序,並有初始化設置null回調到一個指針?

+0

我不明白究竟你的意思。你能提供一個或兩個例子嗎? – glglgl

+0

以調試爲例,大多數是單獨的文本,'DebugMessage(「無論什麼特定的錯誤」),但有些你可能想添加額外的信息 - 最簡單的是一些簡單變量的值。現在你可以使用printf並分配一個字符串緩衝區,填充它併發送回去,但這比'DebugMessage(「在測試點%d失敗; var1 =%d,var2 =%d」,23,a ,b)'因爲DebugMessage可能在嵌入式平臺(輸出到串口)上執行不同的操作,而不是在基於GUI的桌面PC上執行(彈出一個對話框),您希望它在更高級別上運行。更清晰? –

+0

部分,是的。你可以很高興地爲此創建一個可變參數函數。但是一定要記得提供一個採用'va_list'並且由其他人調用的版本。在那裏有作者「忘記」他們的圖書館,並且擴展它們是一個真正的PITA。 – glglgl

回答

2

您無法傳遞可變參數。您必須將它們取到va_list並將其傳遞給內部函數。

看看this Question at the C FAQ。它定義了一個可變參數error函數,它想要轉發到printf。這只是你的用例。

same FAQs,所以一般建議有一個(或大部分)版本服用va_list每一個參數可變型函數