困惑所有不同的字符串类型以及如何在Visual C ++中正确使用它们

时间:2011-12-08 17:55:24

标签: string visual-c++

多年前,我曾经在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;
}

我的困惑是:

  1. 为什么我需要将参数2的c_str()用于MessageBoxW,为什么我需要在参数3中使用_T()宏(?)?

  2. 为什么程序在第二个代码示例中没有进行某种转换?

  3. LPCTSTR究竟是什么意思?我在MSDN函数中看到另一个名为LPTSTR的变种。

  4. 谢谢!

2 个答案:

答案 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)

  1. MessageBoxW函数需要一个C风格的宽字符串(WCHAR )。宏_L()改变你的字符串,使它与Unicode兼容(WCHAR 而不是char *)。

  2. argv []不执行任何对象,因此您已经从中获取了WCHAR指针。

  3. LPCTSTR基本上是const char *或const WCHAR *的WINAPI typedef,具体取决于您是否构建为UNICODE。另请参阅此帖子:LPCSTR, LPCTSTR and LPTSTR

  4. 简而言之,您的主要功能是传递WCHAR *字符串,MessageBoxW需要WCHAR *字符串。