2013-11-27 44 views
1

我在Windows7 Professional(32位)上使用C++ Builder XE4。將NULL字符串放入String()中的%s。sprintf()

我在下面的代碼中找到了區別。

String lbl = L""; 

String msg1 = String().sprintf(L"[%s]", lbl); 
ShowMessage(msg1); // [(null)] 

String msg2 = String().sprintf(L"[%s]", lbl.c_str()); 
ShowMessage(msg2); // [] 

我期望msg1和msg2都是「[]」。但實際上,msg1是「[(null)]」。 msg1在語言規範方面是否正確?或者這是「未定義」的行爲?

另一個問題是我應該如何照顧這種錯誤(讓「lbl」不是「lbl.c_str()」)。因爲它們在編譯時都沒有顯示錯誤,所以在編譯時我不會注意到這種錯誤。

我希望知道這種錯誤的一些預防技巧,如果有的話。

回答

1

C++ Builder 32位編譯器不會警告你這個錯誤。基於LLVM編譯器的所有(如bcc64和gcc)出現如下圖所示的錯誤在這種情況下:

cannot pass object of non-trivial type 'String' (aka 'System::UnicodeString') through variadic method; call will abort at runtime 

如果通過C++ Builder的64位(基於LLVM)編譯源代碼,你會看到這個錯誤。

+0

非常感謝您的回覆。很高興知道有一些環境錯誤變得清晰。 – sevenOfNine