此代码有效:
char* CFichierTrace::ConvertBSTRToString(BSTR* str) { if ( str == NULL ) { char* buf = new char[2]; sprintf_s(buf, 2, "%s", ""); return buf; } else return _com_util::ConvertBSTRToString(*str); }
但是我试图避免多次返回,我被告知编程错误。然而,它不会工作:
char* CFichierTrace::ConvertBSTRToString(BSTR* str) { // char* result = new char[1]; (attempt #1, produces garbage as output) char* result = (char*) malloc(1 *sizeof(char)); (attempt #2, more garbage as output) if ( str == NULL ) { char* buf = new char[2]; sprintf_s(buf, 2, "%s", ""); result = buf; } else result = _com_util::ConvertBSTRToString((BSTR) str); return result; }
有一篇文章关于将字符串作为char **返回参数(通过ref),但是我不明白为什么不能返回堆中的char *?
答案 0 :(得分:2)
你这样做:
char* CFichierTrace::ConvertBSTRToString(BSTR* str)
{
char* buf;
if ( str == NULL )
{
buf = new char[2];
sprintf_s(buf, 2, "%s", "");
}
else
buf = _com_util::ConvertBSTRToString(*str);
return buf;
}
答案 1 :(得分:2)
char* CFichierTrace::ConvertBSTRToString(BSTR* str)
{
char* ret;
if ( str == NULL )
{
ret = new char[1];
ret[0] = 0;
}
else
ret = _com_util::ConvertBSTRToString(*str);
return ret;
}
顺便说一句,你不应该将C ++ new
与C malloc
混合使用。
此外,可以说多个返回点是一种不好的做法。当您有多个返回点时,有许多情况下代码更具可读性。
答案 2 :(得分:2)
我只是假设您知道为什么您将指针传递给BSTR而不是BSTR。
char* CFichierTrace::ConvertBSTRToString(BSTR* str) {
return _com_util::ConvertBSTRToString(*str);
}
由于BSTR
- 语义,这是正确的实现
为了澄清,所有适当的BSTR
- 函数都将NULL
视为与0长BSTR
相同。
无论如何,在任何有意义的地方使用多个返回点,除非你的编码标准不符合这一点。