【问题标题】:How to deal with WinAPI macros overriding some function names?如何处理覆盖某些函数名称的 WinAPI 宏?
【发布时间】:2021-11-01 13:48:58
【问题描述】:

<windows.h> 为 WinAPI 的 Ansi 和 Unicode 版本定义宏。 我的类库中有一个名为SendMessage 的函数。在包含我的库之前包含<windows.h> 之前它工作正常。在这种情况下,SendMessage 被宏覆盖,函数名称变为SendMessageASendMessageW

是否有可能在不更改函数名称的情况下以某种方式处理它以保存与旧版本库的兼容性?

【问题讨论】:

  • 我很确定 Herb Sutter 或 Raymond Chen 写过一篇关于这个确切问题的文章,但我再也找不到了。
  • 真正的问题是您选择使用您的库的客户端可能无法命名的符号。
  • 这就是现代 C 库为其函数、类型和宏添加前缀的原因

标签: c++ c windows winapi macros


【解决方案1】:

真正的问题是 WinAPI 的函数定义是在 C 预处理器级别,所以你必须编写一些丑陋的代码来尝试与它们共存。

如果可能,您应该重命名代码库的函数,以免与 WinAPI 发生冲突。


否则,您可以在定义自己的函数之前编写#undef SendMessage之类的代码来取消定义WinAPI对该函数的定义。

如果您需要在定义自己的函数和使用 WinAPI 的函数宏之间切换,您还可以使用 #pragma push_macro#pragma pop_macro 功能将宏保留在 undef 之前并在之后恢复。

【讨论】:

  • 第二段没有多大帮助。当图书馆的客户选择#include <Windows.h>时,他们就不能再调用图书馆了。
  • 我真的希望微软最终能摆脱这些与 C 语言冲突的 TCHAR 宏,或者至少在为 C++ 编译代码时禁用它们。使用重载的内联函数会是一个更安全的选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 2016-10-01
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
相关资源
最近更新 更多