如何告诉预处理器不要替换特定的宏?
具体问题如下: Windows 头文件定义 GetMessage 宏。
我的 API 的 C++ 头文件有一个 GetMessage 方法。我不想重命名我的方法。但是在 Windows 上使用 API 时,包括 windows.h 将我的 GetMessage 方法调用替换为 GetMessageA。
如何告诉预处理器不要替换特定的宏?
具体问题如下: Windows 头文件定义 GetMessage 宏。
我的 API 的 C++ 头文件有一个 GetMessage 方法。我不想重命名我的方法。但是在 Windows 上使用 API 时,包括 windows.h 将我的 GetMessage 方法调用替换为 GetMessageA。
你试过做一个
#undef 获取消息
甚至
#ifdef 获取消息 #undef 获取消息 #万一
然后直接调用 windows GetMessageA 或 GetMessageW,以适当者为准。
您应该知道您是否将 char* 用于 wchar_t8..
(感谢 don.neufeld)
Brian 还说只是一些有用的信息,您还可以使用#pragma push_macro/pop_macro 来推送和弹出宏定义。如果您想覆盖代码块中的宏定义,这非常有用:
#pragma push_macro("GetMessage")
#undef GetMessage
// Your GetMessage usage/definition here
#pragma pop_macro("GetMessage")
我怀疑这是 MS 特有的功能,所以请记住这一点。
(GetMessage)(...)
只是一些有用的信息,您还可以使用#pragma push_macro/pop_macro 来推送和弹出宏定义。如果您想覆盖代码块中的宏定义,这非常有用:
#pragma push_macro("GetMessage")
#undef GetMessage
// Your GetMessage usage/definition here
#pragma pop_macro("GetMessage")
我怀疑这是 MS 特有的功能,所以请记住这一点。
是否有代码同时调用您的 GetMessage 和 Window 的 GetMessage?
这样的代码将无法区分它们两者。您将无法在同一个文件中调用两者。
如果您在一个文件中使用一个函数而在另一个文件中使用另一个函数,只需在一个文件中执行建议的#undef。
鉴于您在评论中概述的限制,您可以这样做的唯一方法是执行以下操作:
#undef GetMessage
在调用 API 的 GetMessage 之前。(这假设在源文件中的这一点之后没有人调用 Win32 GetMessage。)