【问题标题】:Why does VS define a macro for my function?VS 为什么要为我的函数定义一个宏?
【发布时间】:2023-03-18 04:08:01
【问题描述】:

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

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

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

#define GetDateFormat GetDateFormatA

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

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

【问题讨论】:

  • 宏在您编写函数之前就已存在。
  • 那么这个宏是在哪里定义的呢?
  • @UKMonkey 给定A 后缀,很可能是<windows.h>(或其中包含的标头)。这就是 Windows 区分基于char 和基于wchar_t 的例程的方式。
  • @Angew 我不反对——但问一下也无妨……如果它在“MyEpicClass.h”中并且是自动生成的,那么这是一个非常合理的问题。
  • 请发布(和谷歌)函数的确切名称。您可能会发现有一个同名的 WinAPI 函数,它可以帮助您解释行为。

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


【解决方案1】:

GetDateFormat 是一个 WinAPI 函数,它至少接受一个类型涉及TCHAR 的参数(在这种情况下,它是参数LPCTSTR lpFormatLPTSTR lpDateStr)。所有此类 WinAPI 函数实际上都以两种形式存在:一种附加了A,另一种附加了W。当TCHAR 表示char 时使用A 变体,当TCHAR 表示wchar_t 时使用W 变体。为了支持这一点,<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

【讨论】:

  • 感谢您的回答和链接。 :)
猜你喜欢
  • 1970-01-01
  • 2013-06-04
  • 2011-08-05
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 2019-10-28
  • 2012-12-05
  • 1970-01-01
相关资源
最近更新 更多