我有一个成员函数,它返回对该类CString
成员的引用。它看起来像这样:
const CString& GetDateFormat() const { return MyString; }
我正在使用Visual Studio 2015,每当我输入此功能时,IDE会自动将其更改为GetDateFormatA()
。当我转到函数定义并将鼠标悬停在函数名称上时,我看到了:
#define GetDateFormat GetDateFormatA
所以就像VS自动创建了这个宏。
这个函数运行正常,但我已经多次看过了(我的意思是一个函数 - 由其他人编写 - 宏通过附加A
重命名它),我很好奇,有点困惑。目的是什么?它是与字符编码相关的东西还是至少与字符串相关的东西?
答案 0 :(得分:0)
GetDateFormat
是一个WinAPI函数,它至少采用一个类型涉及TCHAR
的参数(在这种情况下,它是参数LPCTSTR lpFormat
和LPTSTR lpDateStr
) 。所有这些WinAPI函数实际上都以两种形式存在:一个附加A
,另一个附加W
。当A
表示TCHAR
时使用char
变体,W
表示TCHAR
时使用wchar_t
变体。为了支持这一点,<windows.h>
实际上为每个这样的函数定义了一个宏,根据是否定义了_UNICODE
来解析一个或另一个。在您的情况下,WinAPI标题中的某个定义与此类似:
#ifdef _UNICODE
# define GetDateFormat GetDateFormatW
#else
# define GetDateFormat GetDateFormatA
#endif
这是您的计划偶尔引用GetDataFormatA
的地方。您可以阅读有关working with TCHAR
s on MSDN的更多信息。
如何解决这个问题取决于您是否需要调用WinAPI GetDateFormat
并使用char
/ wchar_t
区别。如果是这样,您将不得不重命名您的功能。但是,我的印象是您对WinAPI功能不感兴趣。在这种情况下,解决方案是在标题中添加以下行,以声明您的GetDateFormat
:
#include <windows.h>
#undef GetDateFormat
这样,没有人会使用您的标题会看到该宏,GetDateFormat
将保持GetDateFormat
。