将NULL字符串放入String()中的%s。sprintf()

时间:2013-11-27 02:18:06

标签: unicode c++builder

我在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()”)。因为它们在编译时都没有显示错误,所以在编译时我不会注意到这种错误。

如果有的话,我希望知道这种错误的一些预防技巧。

1 个答案:

答案 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),您将看到此错误。