我对执行此操作的正确方法有些困惑。我有一个#DEFINE
包含一个字符串的,我有一个CHAR16*
我想设置为那个字符串的。我将如何正确地做到这一点?我试过了:
#DEFINE MYSTRING "HELLO"
CHAR16* THISONE;
THISONE = MYSTRING;
为什么这行不通?我希望能够打印出THISONE
. 我收到有关不兼容类型的编译器警告。我确定我错过了一些小东西?
我对执行此操作的正确方法有些困惑。我有一个#DEFINE
包含一个字符串的,我有一个CHAR16*
我想设置为那个字符串的。我将如何正确地做到这一点?我试过了:
#DEFINE MYSTRING "HELLO"
CHAR16* THISONE;
THISONE = MYSTRING;
为什么这行不通?我希望能够打印出THISONE
. 我收到有关不兼容类型的编译器警告。我确定我错过了一些小东西?
您正在定义一个窄字符串文字"HELLO"
,但尝试使用CHAR16
指向它的指针。这不是一个兼容的任务。正如clang
所说:
example.cpp:9:13: error: assigning to 'wchar_t *' from incompatible type
'const char [6]'
THISONE = MYSTRING;
^ ~~~~~~~~
1 error generated.
(我将类型从更改为CHAR16 *
,wchar_t *
因为我不在 Windows 上 - 语义是相同的)。
要修复它,您需要L
在字符串常量前面添加一个:
#define MYSTRING L"HELLO"
然后它会编译。在 C 中,你完成了。但是,在 C++ 中,您可能仍会收到警告:
example.cpp:9:15: warning: conversion from string literal to 'wchar_t *' is
deprecated [-Wdeprecated-writable-strings]
THISONE = MYSTRING;
^
example.cpp:3:18: note: expanded from macro 'MYSTRING'
#define MYSTRING L"HELLO"
^
1 warning generated.
将定义更改为:
const wchar_t *THISONE;
修复该警告。我猜你的情况是:
const CHAR16 *THISONE;
编者注——以后请出示你的真实代码。 #DEFINE
(大写字母)不是有效的 C 或 C++。
你可能想要这样的东西:
// Update: As carl points out, there is more to this for wide chars
const CHAR16* THISONE = MYSTRING;
您可以在此处以及在此站点中探索更多关于c-strings 的信息。
您可能希望将其分配为全局变量。在这种情况下,您需要:
#define MYSTRING "HELLO"
CHAR* THISONE = MYSTRING;
或者
#define MYSTRING L"HELLO"
CHAR16* THISONE = MYSTRING;
如果赋值在函数中(main() 或其他),您可以在与变量创建不同的位置进行赋值。
实际上,我不确定是否有“CHAR16”这样的类型