Почему часть моего кода не выполняется?
Я использую 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);