Почему часть моего кода не выполняется?

Я использую 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
<--

(или то же самое с "нет" вместо этого.) Но я получаю

-->
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 ответа

Решение

Вам нужно использовать GeDebugOut как вы используете printf:

GeDebugOut("Some message =  %s ", whatever);

где whatever является c-строкой, то есть ее тип char*,

С перегрузкой GeDebugOut принимает String введите также, то я думаю, что вам нужно использовать Unicode как:

GeDebugOut(L"Is there a subroot?   " + str);
        // ^ note this!

потому что я подозреваю, что если включен юникод, то CHAR в основном wchar_tне char, И из-за этого конкатенация строк не работает, так как строковый литерал неявно не преобразуется в String тип, который будет передан + перегрузки.

Как вы упомянули, есть две версии GeDebugOut компилятор может выбирать из:

void GeDebugOut(const CHAR* s,  ...);
void GeDebugOut(const String& s);

когда он встречает:

GeDebugOut("Is there a subroot?   " + str);

"Is there a subroot" строковый литерал, который переводится в тип const char*, Я подозреваю String имеет оператор преобразования в некоторый числовой тип. Таким образом, компилятор выбирает первую перегрузку.

Это приводит к поведению, которого вы не ожидаете, потому что + операция для const char* арифметика указателей, а не конкатенация строк, поэтому вы звоните GeDebugOut на сумму указателя вашего строкового литерала, и независимо от того, что вывод const char* преобразование str является.

Есть несколько способов исправить это. Как уже упоминалось, вы можете изменить его на printf-подобный синтаксис. Или вы можете заставить его использовать String перекрываются вот так:

GeDebugOut(String("Is there a subroot?") + str);

Вы не можете добавить строку к строковому литералу.

"Is there a subroot" является строковым литералом, и компилятор увидит его использование в качестве указателя на этот литерал.

Лучшим способом было бы сделать:

GeDebugOut("Is there a subroot? %s ", str);
Другие вопросы по тегам