多年前,我曾经在C中做过一些基本的编程。现在我试图重新学习我已经忘记的东西以及学习Visual C ++。我对所有的字符串选项感到困惑,现在我试图让我的程序与Unicode兼容。我一直在阅读Beginning Visual C ++ 2010以及在线阅读以了解这些信息。
作为练习,我正在编写一个非常基本的程序,要求用户输入一些文本,然后以消息框的形式显示该文本。该程序可行,但我的工作方式更多是通过猜测和查看其他示例,而不是真正理解为什么我需要将各种字符串转换为不同的类型。
代码是:
#include "stdafx.h"
#include <iostream>
#include <string>
#include "Windows.h"
using std::wcin;
using std::wcout;
using std::wstring;
int _tmain(int argc, _TCHAR* argv[])
{
wstring myInput;
wcout << "Enter a string: ";
getline(wcin, myInput);
MessageBoxW(NULL, myInput.c_str(), _T("Test MessageBox"), 64);
return 0;
}
MessageBox语法是:
int WINAPI MessageBox(
__in_opt HWND hWnd,
__in_opt LPCTSTR lpText,
__in_opt LPCTSTR lpCaption,
__in UINT uType
);
另一方面,如果我只使用命令行参数作为消息框的文本,我根本不需要转换字符串,我不知道为什么。
#include "stdafx.h"
#include <iostream>
#include <string>
#include "Windows.h"
using std::wcout;
int _tmain(int argc, _TCHAR* argv[])
{
MessageBoxW(NULL, argv[1], _T("Test MessageBox"), 64);
return 0;
}
我的困惑是:
为什么我需要将参数2的c_str()用于MessageBoxW,为什么我需要在参数3中使用_T()宏(?)?
为什么程序在第二个代码示例中没有进行某种转换?
LPCTSTR究竟是什么意思?我在MSDN函数中看到另一个名为LPTSTR的变种。
谢谢!
答案 0 :(得分:1)
1) .c_str()是一种标准 C ++方法,用于将C ++字符串转换为C字符串。 _tmain,_T('x'),_ T(“text”)和_TCHAR 是(有点难看) Microsoft 宏,使您的程序以unicode或非unicode编译模式。项目选项中有一个全局设置,它设置了一些宏来以这两种模式之一配置项目。
如果您处于非unicode模式(在MS的文档中称为ANSI模式),宏将扩展为:
main,'x',“text”,char
如果您处于unicode模式,则宏将扩展为
wmain,L'x',L“text”,wchar_t
2)和 3) Windows标头中充满了typedef和类似的宏。有时他们会使代码更加模糊不清。一般来说, LP 表示指针(长指针,我猜,但是我们需要区分近指针和远指针已经有一段时间了), C 表示“const”, T 表示它将是char或wchar_t,具体取决于项目设置, STR 显然是“字符串”。毕竟,它是一个简单的C类型,这就是为什么你可以在没有转换的情况下将C字符串传递给它们。
答案 1 :(得分:0)
MessageBoxW函数需要一个C风格的宽字符串(WCHAR )。宏_L()改变你的字符串,使它与Unicode兼容(WCHAR 而不是char *)。
argv []不执行任何对象,因此您已经从中获取了WCHAR指针。
LPCTSTR基本上是const char *或const WCHAR *的WINAPI typedef,具体取决于您是否构建为UNICODE。另请参阅此帖子:LPCSTR, LPCTSTR and LPTSTR
简而言之,您的主要功能是传递WCHAR *字符串,MessageBoxW需要WCHAR *字符串。