Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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
C++ 为什么VS为我的函数定义宏?_C++_Visual Studio 2015_Macros - Fatal编程技术网

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函数,它可以帮助您解释该行为。谢谢您的回答和链接。:)