2010-08-16 37 views
6

c類型無類型變量參數列表中的類的有意使用是常見的錯誤源。 實施例:有沒有辦法通過c風格變量參數列表中的值來禁止使用類?

class MyString { 
    public: 
    char *pChars; 
    int Length; 

    MyString(char *pChars) { 
     this->pChars = pChars; 
     Length = strlen(pChars); 
     } }; 

int main() { 
    MyString s1("Bla1"), s2("Bla2"); 
    printf("%s%s", s1, s2); // This does not but should give a compiler warning/error! 
    return 0; } 

的printf的呼叫有由值接收兩個s對象。這意味着他們的所有成員都只是記憶複製。但它們被解釋爲一個簡單的char指針。結果當然是一個運行時錯誤。

我不是要求這個解決方案,但我想有一些我可以添加到我的類,以便編譯器警告我,或給出錯誤。

已嘗試聲明但未實現複製構造函數。但似乎沒有複製構造函數被調用。 :-(

請只是回答到標題中的問題,我不需要的,爲什麼你不應該使用printf或者這些可變參數列表商榷 - 知道

感謝您的時間

+1

你正在使用哪種編譯器? – kennytm 2010-08-16 13:12:51

+0

「我不需要討論爲什麼你不應該使用printf或這些可變參數列表 - 知道這一點。」 - printf有什麼問題? – alternative 2010-08-16 13:22:12

+0

我正在使用visual C++ – 2010-08-16 13:34:33

回答

11

體面的編譯器(如GCC)檢查printf參數是否在格式字符串匹配的格式說明。

只是不要忘了添加-Wformat-Wall命令行選項。

http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

+4

好吧,也許Visual C++不是血統編譯器? – 2010-08-16 13:44:33

+2

@kaptnole他們推遲正軌,至少關於你遇到的問題:) http://connect.microsoft.com/VisualStudio/feedback/details/98899/compiler-should-warn-about-passing-objects-的,非POD類型到最省略號。 我知道你不想聽到這個,但不要使用printf見這裏的建議http://stackoverflow.com/questions/2017489/should-i-use-printf-in-my-c-code – celavek 2010-08-16 14:18:20

+0

@celavek我會接受你的評論作爲答案,如果你將它作爲一個發佈:-) – 2010-09-09 11:23:17

0
+1

這相當於Cătălin的答案,並有同樣的問題;它不會阻止經過'...',因爲這會給出未定義的行爲,而不是副本。 – 2010-08-16 14:43:24

0

隱藏拷貝構造函數和賦值運算符(聲明爲private,沒有必要實施它們)。或者從boost :: noncopyable派生類(它具有相同的效果)。通過值傳遞參數決定了複製構造函數的用法。

+2

除非這樣做沒有幫助,因爲實例沒有按值傳遞,而是傳遞了一些原始字節,然後'reinterpret_cast' -ed變爲'const char *'。我不認爲有一種語言水平的手段來避免這種情況。你只能依靠編譯器警告(例如「不能通過非POD對象...」「) – visitor 2010-08-16 13:46:39

+1

那麼OP在他的問題中已經說過他在使用拷貝構造函數了,你是否認爲重載賦值操作符會改變行爲?是visual C++的一個特性/缺陷嗎? – 2010-08-16 14:21:32

+0

不起作用,沒有拷貝/賦值構造函數調用 – 2010-08-16 14:40:27

相關問題