我在Windows7 Professional(32位)上使用C ++ Builder XE4。
我在以下代码中找到了区别。
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()”)。因为它们在编译时都没有显示错误,所以在编译时我不会注意到这种错误。
如果有的话,我希望知道这种错误的一些预防技巧。
答案 0 :(得分: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),您将看到此错误。