Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
visualc&x2B+;自动将A或W追加到函数末尾 在C++中,我定义了一个类,它作为成员: static const std::basic_string<TCHAR> MyClass_;_C++_String_Winapi_Visual C++_Unicode - Fatal编程技术网

visualc&x2B+;自动将A或W追加到函数末尾 在C++中,我定义了一个类,它作为成员: static const std::basic_string<TCHAR> MyClass_;

visualc&x2B+;自动将A或W追加到函数末尾 在C++中,我定义了一个类,它作为成员: static const std::basic_string<TCHAR> MyClass_;,c++,string,winapi,visual-c++,unicode,C++,String,Winapi,Visual C++,Unicode,当我创建这个类的一个实例,然后尝试访问它时,会弹出intellisense,但是名称已经更改,这取决于项目是针对Unicode还是多字节编译的。如果已为Unicode编译,则函数显示为: aClass.GetMyClassNameW(); 否则就是: aClass.GetMyClassNameA(); 我想知道的是这个名字是怎么改的? 我还想知道intellisense是否可以显示函数的正确名称?这样我就可以像这样访问它: aClass.GetMyClassName() 编辑:我在代码中使

当我创建这个类的一个实例,然后尝试访问它时,会弹出intellisense,但是名称已经更改,这取决于项目是针对Unicode还是多字节编译的。如果已为Unicode编译,则函数显示为:

aClass.GetMyClassNameW();
否则就是:

aClass.GetMyClassNameA();
我想知道的是这个名字是怎么改的? 我还想知道intellisense是否可以显示函数的正确名称?这样我就可以像这样访问它:

aClass.GetMyClassName()
编辑:我在代码中使用的确切成员函数名称是:

WinClass::GetClassName()

您的方法名称字面上是“GetMyClassName”还是“GetClassName”


GetClassName位于SDK(winuser.h)中,并根据UNICODE定义重新定义。如果您使用的是“GetClassName”,那么intellisense可能会感到困惑;事实上,编译器也在为实际编译的方法生成A/W后缀,但这一切都会起作用,因为每个人(链接器/编译器)都同意重新定义的名称(即使它不可见)。

这是windows支持事实上2个版本的Win32 API的方式:

  • 一个用于带有(
    char
    )的1字节ascii字符
  • 一个用于unicode,字符通常为2字节宽(
    wchar
如果您查看例如
winuser.h
,您将看到以下内容:

WINUSERAPI
BOOL
WINAPI
SetWindowTextA(
    __in HWND hWnd,
    __in_opt LPCSTR lpString);
WINUSERAPI
BOOL
WINAPI
SetWindowTextW(
    __in HWND hWnd,
    __in_opt LPCWSTR lpString);
#ifdef UNICODE
#define SetWindowText  SetWindowTextW
#else
#define SetWindowText  SetWindowTextA
#endif // !UNICODE

我不能确切地说出为什么函数GetMyClassName也会发生同样的情况。但它可能也有同样的原因。

可能的解决方案应该是更改函数名或取消宏的定义。没错,它是GetClassName()。非常感谢,这似乎就是它这么做的原因。−1所声称的事实是不真实的。
WINUSERAPI
BOOL
WINAPI
SetWindowTextA(
    __in HWND hWnd,
    __in_opt LPCSTR lpString);
WINUSERAPI
BOOL
WINAPI
SetWindowTextW(
    __in HWND hWnd,
    __in_opt LPCWSTR lpString);
#ifdef UNICODE
#define SetWindowText  SetWindowTextW
#else
#define SetWindowText  SetWindowTextA
#endif // !UNICODE