2011-01-06 2 views
0

У меня есть программа, в которой мне нужно использовать Format(); чтобы объединить строковый литерал и int в переменную CString. Я попробовал несколько различных способов сделать это, код для них здесь:Преобразование ошибок в C++

// declare variables used 
CString _CString; 
int _int; 

// try to use format function with string literal 
_CString.Format("text",_int); 

// try to use format function with C-Style cast 
_CString.Format((wchar_t)"text",_int); 

// try to use format function with static_cast 
_CString.Format(static_cast<wchar_t>("text"),_int); 

Первый возвращает ошибку C2664: Пустота ATL :: CStringT :: Format (Const wchar_t *, ...) ' : невозможно преобразовать параметр 1 из 'const char [33]' в 'const wchar_t *'

Для второго нет ошибки, но текст появляется на иероглифах.

Третий возвращает ошибку C2440: 'static_cast': не может конвертировать из 'сопзЬ гольца [33]' к 'wchar_t'

Любые идеи для преобразования CStrings в wchar_t * S?
Благодаря

+0

Это SUPER nitpicky, но с технической точки зрения вы не должны указывать переменные с именами, у которых есть знак подчеркивания, за которым следует заглавная буква. Эти имена зарезервированы реализацией для любого использования, которое они считают (в том числе злых макросов произвола). Просто подумал, что я бы назвал это как FYI. – templatetypedef

ответ

1

Проблема заключается в том, что вы выполняете UNICODE сборку (которая отлично), поэтому функция

_CString.Format(); 

я ожидал первый параметр, чтобы быть строка широких символов. Вы должны использовать синтаксис L"", чтобы сформировать строку широких символов буквального:

_CString.Format(L"text",_int); 

Конечно, вам нужно спецификатор на самом деле получить int переменную отформатированный в CString:

_CString.Format(L"text: %d",_int); 

Если вы включаете заголовок tchar.h, вы можете использовать макросы Microsoft для создания строкового литерала с широким или обычным старым символом (иначе известный как ANSI) в зависимости от того, строите ли вы UNICODE или нет:

_CString.Format(_T("text: %d)",_int); 

но я бы сказал, что, если вы не планируете поддерживать устаревшие материалы, для которых потребуется поддержка ANSI, я, вероятно, не стал бы беспокоиться о вещах tchar.h.

+0

Спасибо !!! синтаксис L "" работал! –

2

Ну, это не совсем ясно, какой тип строки вы хотите цель, но вот то, что я буду делать:

_CString.Format(_T("%d"), _int); 

Попытка приведения типа строки многобайтную в Unicode строка может компилироваться, но она просит проблемы, потому что это все еще многобайтовая строка. Вам нужно будет преобразовать всю строку, а не просто придумать ее, если это то, что вы хотите.

Смежные вопросы