【问题标题】:Prevent C preprocessor to do a specific macro subsitution防止 C 预处理器执行特定的宏替换
【发布时间】:2008-11-14 22:08:09
【问题描述】:

如何告诉预处理器不要替换特定的宏?

具体问题如下:windows头文件中定义了GetMessage宏。

我的 C++ 头文件和我的 API 有一个 GetMessage 方法。我不想重命名我的方法。但是在 Windows 上使用 API 时,包括 windows.h 将我的 GetMessage 方法调用替换为 GetMessageA。

【问题讨论】:

  • 只做#undef GetMessage 不好,因为使用API​​ 的代码也使用Windows GetMessage。
  • 啊,Windows SDK 不加选择地使用宏破坏任何和所有命名空间(而不仅仅是在 C++ 的命名空间功能中)的另一个示例。
  • @vincent:见 don.newfeld 在 ShoeLace 的#undef GetMessage 回答中的评论

标签: c++ c-preprocessor getmessage


【解决方案1】:

你试过做一个

#undef GetMessage

甚至

#ifdef GetMessage
#undef 获取消息
#endif

然后直接调用windows GetMessageA 或GetMessageW,以合适的为准。

您应该知道您是否将 char* 用于 wchar_t8..

(感谢 don.neufeld)

布赖恩也说过 只是一些有用的信息,您还可以使用#pragma push_macro/pop_macro 来推送和弹出宏定义。如果您想在代码块中覆盖宏定义,这非常有用:

#pragma push_macro("GetMessage")
#undef GetMessage

// Your GetMessage usage/definition here

#pragma pop_macro("GetMessage")

我怀疑这是 MS 特有的功能,所以请记住这一点。

【讨论】:

  • 但是我不能再使用Windows GetMessage了
  • 可以,只要直接调用 GetMessageA 或 GetMessageW 即可。
  • 而且,是的,push_macro 和 pop_macro 是特定于 MS 的。 Pragmas 是由定义实现的,我没有注意到这些外部 MS 代码。当然,对于编写 Windows API 的人来说,这可能不是问题。
  • #pragma push_macro#pragma pop_macro 从 gcc 4.3 开始支持。
【解决方案2】:

(GetMessage)(...)

GetMessage on MSDN

【讨论】:

  • 虽然这通常是避免无意中被宏破坏的好方法,但我认为它不适用于 GetMessage,因为它没有被定义为“类似函数”的宏。
  • 哦,对了……这只有在函数声明在宏之前而不是之后才有效(我认为无论如何都不能保证)。微信
【解决方案3】:

只是一些有用的信息,您还可以使用#pragma push_macro/pop_macro 来推送和弹出宏定义。如果您想在代码块中覆盖宏定义,这非常有用:

#pragma push_macro("GetMessage")
#undef GetMessage

// Your GetMessage usage/definition here

#pragma pop_macro("GetMessage")

我怀疑这是 MS 特有的功能,所以请记住这一点。

【讨论】:

  • MS 特定应该不是问题,因为问题出在 windows.h 定义的宏中:-P
  • 这是一个问题,因为有针对 Windows 的非 MS 编译器套件(例如,mingw)。
【解决方案4】:

是否有代码同时调用您的 GetMessage 和 Window 的 GetMessage?

这样的代码将无法区分它们两者。您将无法在同一个文件中同时调用两者。

如果您在一个文件中使用一个函数而在另一个文件中使用另一个函数,只需在一个文件中执行建议的#undef。

【讨论】:

    【解决方案5】:

    鉴于您在评论中概述的限制,您可以这样做的唯一方法是:

    #undef GetMessage
    

    就在调用 API 的 GetMessage 之前。 (这假设在源文件中的这一点之后没有人调用 Win32 GetMessage。)

    【讨论】:

    • 这不是唯一的方法,但它要求您不要包含 windows.h。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    相关资源
    最近更新 更多