【问题标题】:Visual C++ Automatically Appending A or W to end of FunctionVisual C++ 自动将 A 或 W 附加到函数末尾
【发布时间】:2010-01-29 12:12:03
【问题描述】:

在 C++ 中,我定义了一个以它为成员的类:

static const std::basic_string<TCHAR> MyClass_;

这个值还有一个getter函数:

LPCTSTR CClass::GetMyClassName()
{
    return MyClass_.c_str();
}

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

aClass.GetMyClassNameW();

否则:

aClass.GetMyClassNameA();

我想知道名称是如何更改的? 另外我想知道智能感知是否可以显示函数的正确名称?这样我就可以像这样访问它:

aClass.GetMyClassName()

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

WinClass::GetClassName()

【问题讨论】:

  • −1 所称事实不真实。

标签: c++ string winapi visual-c++ unicode


【解决方案1】:

您的方法名称实际上是“GetMyClassName”还是“GetClassName”?

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

【讨论】:

  • 可能的解决方案应该是更改函数名称或#undef-ing 宏。
  • 你说得对,它是 GetClassName()。非常感谢,这似乎是它这样做的原因。
【解决方案2】:

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

  • 一个用于 1 字节的 ascii 字符,带有 (char)
  • 一个用于 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 会发生同样的情况。但它可能有同样的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2012-06-28
    • 2019-02-22
    • 2014-08-21
    • 2014-03-06
    • 1970-01-01
    • 2013-08-08
    相关资源
    最近更新 更多