为什么我的部分代码没有被执行?

时间:2012-07-25 15:36:58

标签: c++ compiler-optimization cinema-4d

我正在使用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);

3 个答案:

答案 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