许多旧的C / C ++项目使用:
static TCHAR *x(_T("hello"));
...定义字符串,但是ISO C ++ 11不允许从字符串文字转换为TCHAR *
(又名wchar_t *
),因此我正在寻找一种安全的替代方法来编写这些字符串static TCHAR *
行。
将其更改为std::wstring x(L"hello"))
会带来其他问题,例如“已定义”错误,那么该怎么办?
答案 0 :(得分:3)
您的问题是一个const正确性问题,因此您不必触摸static
(可处理链接)。这个:
static std::wstring x = L"hello";
与原始代码的含义大致相同。
可以通过几种方式获得该字符串数据的非常量wchar_t *
:
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的地方进行转换