为什么VS为我的函数定义一个宏?

时间:2017-12-08 10:30:35

标签: c++ visual-studio-2015 macros

我有一个成员函数,它返回对该类CString成员的引用。它看起来像这样:

const CString& GetDateFormat() const { return MyString; }

我正在使用Visual Studio 2015,每当我输入此功能时,IDE会自动将其更改为GetDateFormatA()。当我转到函数定义并将鼠标悬停在函数名称上时,我看到了:

#define GetDateFormat GetDateFormatA

所以就像VS自动创建了这个宏。

这个函数运行正常,但我已经多次看过了(我的意思是一个函数 - 由其他人编写 - 宏通过附加A重命名它),我很好奇,有点困惑。目的是什么?它是与字符编码相关的东西还是至少与字符串相关的东西?

1 个答案:

答案 0 :(得分:0)

GetDateFormat是一个WinAPI函数,它至少采用一个类型涉及TCHAR的参数(在这种情况下,它是参数LPCTSTR lpFormatLPTSTR 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 TCHARs on MSDN的更多信息。

如何解决这个问题取决于您是否需要调用WinAPI GetDateFormat并使用char / wchar_t区别。如果是这样,您将不得不重命名您的功能。但是,我的印象是您对WinAPI功能不感兴趣。在这种情况下,解决方案是在标题中添加以下行,以声明您的GetDateFormat

#include <windows.h>
#undef GetDateFormat

这样,没有人会使用您的标题会看到该宏,GetDateFormat将保持GetDateFormat