2012-03-13 29 views
0

我作爲ç使得可變參數所需

AddSprintf(char* , ...) 

我要讓編譯時錯誤,如果有人呼叫它而不兩個參數的函數。 目前如果有人打電話像

AddSprintf("hello") 

它的工作原理。但是我想禁用像這樣的調用。 有什麼辦法使用g ++我可以強制傳遞參數?

+0

添加第二個參數不是一個選項? – 2012-03-13 16:44:14

+0

@BoPersson no。我想確保va_list中至少有一個成員 – 2012-03-13 16:47:12

回答

7

超載AddSprintf:

void AddSprintf(const char* , ...) {} 
void AddSprintf(const char*); 

編譯AddSprintf("hello")

時,然後你得到一個奇怪的錯誤消息,但請記住,與C++ 11,因爲他們是類型安全,你應該使用可變參數模板。

0

什麼

AddSprintf(char* , char*, ...) 

0

你不能,真的。這些點代表「零或多個論點」,並且無法知道是否有任何論點。除了使用匯編程序並對堆棧指針進行一些檢查之外。

0

正如0A0D所說,它是可變參數 - 根據定義,編譯器會很好。如果你想讓它在編譯時失敗,你可能不得不拉動技巧 - 例如,如果你是單元測試,有代碼讓函數失敗並帶有一個參數調用,這樣新的程序員就會知道他們不能做那。

這就是說,你爲什麼要這麼做?您的問題可能有更好的解決方案。

0

如果你想堅持到同一個名字,那麼你可以使用可變參數宏:

#define AddSprintf(X,...) AddSprintf(X,__VA_ARGS__) 

但要非常小心使用此解決方案,爲AddSprintf首先工作作爲文本替換在預處理階段。那麼只有它會是一個功能。