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

奥姆松

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

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

我使用的是 Visual Studio 2015,每当我键入此函数时,IDE 都会自动将其更改为GetDateFormatA(). 当我转到函数定义并将鼠标悬停在函数名称上时,我看到:

#define GetDateFormat GetDateFormatA

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

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

Angew 不再以 SO 为荣

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来源。您可以在 MSDN 上阅读有关使用TCHARs 的更多信息

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

#include <windows.h>
#undef GetDateFormat

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

React Component vs 函数,我应该使用什么,为什么?

为什么我无法打开VS项目

为什么将一个函数定义为一个以上的语句?

为什么每个STL容器都有一个定义为成员函数的交换函数?

为什么在调用另一个函数时不能将一个函数定义为参数?

为什么我必须选择一个操作系统来从 VS2017 生成 Dockerfile?

为什么当我给它一个参数时函数返回未定义

为什么我的函数返回一个未定义的数组作为项目?

为什么此定义返回一个函数?

VS代码-ReferenceError:未定义$为什么?

添加一个空字符串vs toString-为什么不好?

为什么我不能让Suave在VS 2017上工作?

为什么我的 VS Code 终端没有运行代码?

Julia vs MATLAB:为什么我的Julia代码这么慢?

为什么我得到一个未定义的?

为什么我的函数返回一个空数组?

为什么只定义一个尚未定义的宏?

为什么不能在另一个函数中定义一个函数?

Array vs. ArrayList-为什么要在另一个上使用一个?

为什么数组输出在 VS 代码中有一个 () 旁边有一个数字?

为什么从宏获取的一个函数起作用而不能编译另一个函数?

为什么我在React中的状态在一个函数中定义而在另一个函数中未定义?

我已经将自定义函数矢量化了,为什么外部给我一个错误?

为什么我不能从 python 中的另一个函数调用一个函数。函数未定义错误

为什么在C中用一个参数定义一个没有参数的函数?

为什么我的功能模板特化被VS2017而不是VS2015拒绝?

为什么将INT_FAST16_MAX定义为INT32_MAX(VS 2015)?

为什么clojure线程最后一个(->>)宏?

为什么我的所有主机都在puppetmaster上为一个主机定义了安装软件包