我正在使用Visual C ++编译Cinema 4D的插件。
GeDebugOut("-->");
subroot = NULL;
head = NULL;
tail = NULL;
success = PolygonizeHierarchy(source, hh, head, tail, &subroot, malloc);
if (!success) {
/* .. */
}
String str("not set.");
if (subroot) {
GeDebugOut("yes");
str = "yes!";
GeDebugOut("Subroot name: " + subroot->GetName());
}
else {
GeDebugOut("no");
str = "no!";
}
GeDebugOut("Is there a subroot? " + str);
GeDebugOut("<--");
预期输出如下:
-->
yes
Subroot name: Cube
Is there a subroot? yes
<--
(或与“no”相同。)但我得到了
-->
yes
<--
为什么这里缺少两张照片?
这是GeDebugOut
的声明。
void GeDebugOut(const CHAR* s, ...);
void GeDebugOut(const String& s);
String
类是可连接的。它会使+
运算符重载。
String(void);
String(const String& cs);
String(const UWORD* s);
String(const CHAR* cstr, STRINGENCODING type = STRINGENCODING_XBIT);
String(LONG count, UWORD fillch);
friend const String operator +(const String& Str1, const String& Str2);
const String& operator +=(const String& Str);
答案 0 :(得分:5)
您需要使用GeDebugOut
,就像使用printf
:
GeDebugOut("Some message = %s ", whatever);
其中whatever
是一个c字符串,即其类型为char*
。
由于GeDebugOut
的重载也接受String
类型,因此我认为您需要使用unicode:
GeDebugOut(L"Is there a subroot? " + str);
// ^ note this!
因为我的怀疑是如果启用了unicode,那么CHAR
基本上是wchar_t
,而不是char
。因此,字符串连接不起作用,因为字符串文字不会隐式转换为String
类型,而是传递给+
重载。
答案 1 :(得分:1)
您不能将字符串附加到字符串文字。
"Is there a subroot"
是一个字符串文字,编译器会看到它用作指向该文字的指针。
更好的方法是:
GeDebugOut("Is there a subroot? %s ", str);
答案 2 :(得分:1)
正如您所提到的,编译器可以选择两个版本的GeDebugOut
:
void GeDebugOut(const CHAR* s, ...);
void GeDebugOut(const String& s);
遇到时:
GeDebugOut("Is there a subroot? " + str);
"Is there a subroot"
是一个字符串文字,转换为const char*
类型。我怀疑String
有一个转换运算符到某种数字类型。所以编译器选择了第一个重载。
这会导致您不期望的行为,因为+
的{{1}}操作是指针算术,而不是字符串连接,因此您在指针求和上调用const char*
您的字符串文字,以及GeDebugOut
const char*
转换的输出结果。
有几种方法可以纠正这个问题。如上所述,您可以将其更改为str
- 就像语法一样。或者您可以强制它使用printf
重叠,如下所示:
String