用什么代替“静态const TCHAR *”

时间:2018-09-21 08:18:29

标签: c++ c++11 legacy-code

许多旧的C / C ++项目使用:

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

...定义字符串,但是ISO C ++ 11不允许从字符串文字转换为TCHAR *(又名wchar_t *),因此我正在寻找一种安全的替代方法来编写这些字符串static TCHAR *行。

将其更改为std::wstring x(L"hello"))会带来其他问题,例如“已定义”错误,那么该怎么办?

2 个答案:

答案 0 :(得分:3)

您的问题是一个const正确性问题,因此您不必触摸static(可处理链接)。这个:

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

与原始代码的含义大致相同。

可以通过几种方式获得该字符串数据的非常量wchar_t *

  • (C ++ 17及更高版本)x.data();
  • &x[0](不是正式的必需以nul结尾,但否则必须疯狂地实施)。也可以将其包装在函数中,以免被运算符优先误认为:

    wchar_t *data(std::wstring &string) { return &string[0]; }
    
  • 为每个字符串声明一个伴随变量以保留单个标识符:

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

答案 1 :(得分:0)

#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的地方进行转换