Что использовать вместо `static const TCHAR *` - PullRequest
0 голосов
/ 21 сентября 2018

Многие старые проекты C / C ++ используют:

static TCHAR *x(_T("hello"));

... для определения строк, однако ISO C ++ 11 не допускает преобразование строкового литерала в TCHAR * (он же wchar_t *)), поэтому я ищу безопасную альтернативу написанию этих static TCHAR * строк.

Изменение их на std::wstring x(L"hello")) создает другие проблемы, такие как «уже определенные» ошибки, так что делать?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018
#define staticTCHARptr( x , y )  static std::wstring _##x=y; static wchar_t *x = &_##x[0];

Затем используйте это следующим образом:

staticTCHARptr(X,L"hello");

вместо этого:

static TCHAR* X(_T("hello"));

Теперь нет необходимости конвертировать во всех местах, где изначально использовался X

0 голосов
/ 21 сентября 2018

Ваша проблема относится к константности, поэтому вам не нужно прикасаться к static (который обрабатывает связь).Это:

static std::wstring x = L"hello";

будет иметь примерно то же значение, что и исходный код.

Несоответствие wchar_t * данным этой строки может быть получено несколькими способами:

  • (C ++ 17 и выше) x.data();
  • &x[0] (не формально требуется для завершения с нулем, но реализация будет иметьбыть безумным, чтобы сделать иначе).Это также может быть включено в функцию, чтобы избежать прерывания с приоритетом оператора:

    wchar_t *data(std::wstring &string) { return &string[0]; }
    
  • Объявление сопутствующей переменной для каждой строки для сохранения одного идентификатора:

    static std::wstring x = L"hello";
    static wchar_t *x_c = &x[0];
    
...