Printf используется незнакомым образом

Я нашел эту строку кода при обновлении проекта C++ Builder до RAD Studio 2009:

mProcessLength->Text.printf("%d",mStreamLength);

Он не компилируется в 2009 году, однако, какова цель этой строки и что является лучшим эквивалентом? При условии mProcessLength->Text сейчас wchar_t*,

4 ответа

Решение

Я подозреваю, что вы получаете эти ошибки:

E2034 Cannot convert 'const char *' to 'const wchar_t *'
E2342 Type mismatch in parameter 'format' (wanted 'const wchar_t *', got 'const char *')

Это параметры, которые вы передаете в printf, которые не соответствуют. Меняя это на:

mProcessLength->Text.printf(L"%d",mStreamLength);

изменит строковый литерал на правильный тип.

Скорее всего, wchar обрабатывается как строковый тип VCL UnicodeString. Он имеет функцию printf, которая принимает стандартные аргументы printf, за исключением указателя на строку. Сам UnicodeString заполнен отформатированной строкой.

UnicodeString printf

Таким образом, UnicodeString создается в стеке автоматически и вызывается метод printf, затем указатель помещается обратно в wchar.

Вы, вероятно, хотите, чтобы wsprintf... выглядел так, как будто изначально это был некоторый класс с функцией-членом с именем printf, который, вероятно, просто передавал свои параметры в wvsprintf.

В дополнение к этому, если предположить, что Text является свойством, то вызов printf() для него НЕ приведет к обновлению свойства новым значением. И AnsiString, и UnicodeString имеют конструкторы для форматирования числовых значений, поэтому вместо них можно использовать следующее во всех версиях C++Builder:

mProcessLength->Text = mStreamLength; 
Другие вопросы по тегам