C++ 为什么VS为我的函数定义宏?
我有一个成员函数,它返回对类的C++ 为什么VS为我的函数定义宏?,c++,visual-studio-2015,macros,C++,Visual Studio 2015,Macros,我有一个成员函数,它返回对类的CString成员的引用。它看起来像这样: const CString& GetDateFormat() const { return MyString; } 我正在使用Visual Studio 2015,每当我键入此函数时,IDE都会自动将其更改为GetDateFormatA()。当我转到函数定义并将鼠标悬停在函数名称上时,我看到: #define GetDateFormat GetDateFormatA 这就像VS自动创建了这个宏 这个函数工作得很
CString
成员的引用。它看起来像这样:
const CString& GetDateFormat() const { return MyString; }
我正在使用Visual Studio 2015,每当我键入此函数时,IDE都会自动将其更改为GetDateFormatA()
。当我转到函数定义并将鼠标悬停在函数名称上时,我看到:
#define GetDateFormat GetDateFormatA
这就像VS自动创建了这个宏
这个函数工作得很好,但我已经见过很多次了(我指的是一个由其他人编写的函数,它通过附加一个a
宏来重命名),我很好奇,也有点困惑。目的是什么?它是与字符编码有关还是至少与字符串有关?是一个WinAPI函数,它至少接受一个类型涉及TCHAR
的参数(在本例中,是参数LPCTSTR lpFormat
和LPTSTR lpDateStr
)。所有这样的WinAPI函数实际上以两种形式存在:一种是附加了A
,另一种是附加了W
。A
变量在TCHAR
表示char
时使用,而W
变量在TCHAR
表示wchar\t
时使用。为了支持这一点,
实际上为每个这样的函数定义了一个宏,根据是否定义了\u UNICODE
解析为一个宏或另一个宏。在您的例子中,WinAPI头中的某个地方有一个类似于以下内容的定义:
#ifdef _UNICODE
# define GetDateFormat GetDateFormatW
#else
# define GetDateFormat GetDateFormatA
#endif
这就是程序偶尔引用GetDataFormatA
的原因。你可以阅读更多关于
如何解决这个问题取决于您是否需要调用WinAPI的GetDateFormat
并使用其char
/wchar\t
区别。如果是这样,您将不得不重命名您的函数。然而,我的印象是您对WinAPI函数不感兴趣。在这种情况下,一个解决方案是将以下行添加到声明GetDateFormat
的标题中:
#include <windows.h>
#undef GetDateFormat
#包括
#未定义GetDateFormat
这样,使用您的头的任何人都不会看到宏,
GetDateFormat
将保留GetDateFormat
在您编写函数之前,宏就在那里。那么这个宏是在哪里定义的呢?@UKMonkey给出了A
后缀,很可能是
(或从那里包含的头)。这就是Windows如何区分基于char
和基于wchar\u t
的例程。@Angew我并不反对,但询问一下也无妨。。。如果它是在“MyEpicClass.h”中自动生成的,那么这是一个非常合理的问题。请发布(和谷歌)函数的确切名称。您可能会发现有一个同名的WinAPI函数,它可以帮助您解释该行为。谢谢您的回答和链接。:)