【问题标题】:Unicode strings in Orwell Dev-C++Orwell Dev-C++ 中的 Unicode 字符串
【发布时间】:2014-06-18 07:52:30
【问题描述】:

在 Dev-C++ 中编译我的程序时使用

LPCTSTR ClsName = L"BasicApp";
LPCTSTR WndName = L"A Simple Window";

编译中断,但是当我编译我的程序时

LPCTSTR ClsName = "BasicApp";
LPCTSTR WndName = "A Simple Window";

成功了;因此问题是如何以 VS++ 中的“L”的方式将 unicode-strings 传递给 Orwell Dev-C++。

【问题讨论】:

  • “编译中断” 是一个非常模糊的描述,它究竟是如何中断的?您是否收到错误,如果有,哪些错误?]
  • [错误] 初始化时无法将 'const wchar_t*' 转换为 'LPCTSTR {aka const char*}'
  • 您需要更改项目设置以构建 Unicode。
  • 对于LPCTSTR 使用T("") 或类似的东西,而不是L""。在继续之前,您可能应该阅读一些文档。
  • 这正是我所做的:阅读文档,这就是我的来源:functionx.com/win32/Lesson01c.htm“Win32 教程”和 MSDN 上的 Windows 数据类型。

标签: c++ unicode dev-c++


【解决方案1】:

查看微软关于Working with Strings的文档

您可以在非常接近开头的地方阅读:

要声明宽字符文字或宽字符串文字,请将 L 放在文字之前。

wchar_t a = L'a';
wchar_t *str = L"hello";

(此信息不是 Microsoft 特定的。它与 C/C++ 标准相呼应)

然后,如果您咨询您在评论中引用的documentation 并找到LPCTSTR 的条目,您会看到此宏是根据UNICODE 的值有条件地定义的:

#ifdef UNICODE
    typedef LPCWSTR LPCTSTR; 
#else
    typedef LPCSTR LPCTSTR;
#endif

LPCWSTR 的条目告诉您它已定义:

typedef CONST WCHAR *LPCWSTR;

而条目或LPCSTR 告诉您它已定义:

typedef __nullterminated CONST CHAR *LPCSTR;

您正在构建没有定义 UNICODE 的项目。因此,

LPCTSTR ClsName = L"BasicApp";

变成:

__nullterminated CONST CHAR * ClsName = L"BasicApp";

根据上述定义,这涉及使用不兼容的指针类型wchar_t * 初始化CONST CHAR *WndName 也是如此。

要纠正此错误,您必须将UNICODE 添加到项目的预处理器定义中。在 Orwell Dev-C++ IDE 中,通过导航 Project -> Project Options -> Parameters 来执行此操作;在标题为 C++ compiler 的文本框中输入 -DUNICODE 并确定。 Visual Studio C/C++ 项目默认定义UNICODE。 Orwell Dev-C++ 没有。

如果您想编写可在 unicode 和 ANSI 多字节字符集之间移植的字符串文字定义,那么 Working with Strings 会告诉您如何:阅读 TCHARS 的条目。您的字符串文字的可移植定义将是:

LPCTSTR ClsName = TEXT("BasicApp");
LPCTSTR WndName = TEXT("A Simple Window");

【讨论】:

    猜你喜欢
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2014-06-12
    相关资源
    最近更新 更多