【问题标题】:How to resolve it when class method and macro have the same name?类方法和宏同名时如何解决?
【发布时间】:2017-03-21 02:44:19
【问题描述】:

我在升级类时遇到问题,需要导入外部库。

例如,我正在编辑一个名为CFoo 的类,它有一个公共方法SendMessage()。 在我需要包含一个库之前它工作正常 - 其中包含一个也名为 SendMessage() 的宏。它会导致我当前的代码完全混乱,因为包含SendMessage() 的所有部分都被宏替换了。

我发现了一个关于宏命名冲突的类似问题: How do I avoid name collision with macros defined in Windows header files?

但是在我的例子中,公共方法名称不能更改,因为它已经发布并在其他项目中使用。

有没有办法不使用或不包含特定的宏,或者指定在调用函数时是否应该使用宏或方法?

非常感谢。

【问题讨论】:

  • 我相信你可以使用(SendMessage)(args...)来调用成员而不是宏。
  • @EJP 甚至方法定义也被 marco 替换了,因为我实际上将库包含在类头文件中。
  • 那么你肯定会需要#undef 至少在那个时候。

标签: c++ macros


【解决方案1】:

如果不要求符合标准,请尝试push_macro/pop_macro pragmas

#pragma push_macro("SendMessage")
#undef SendMessage
//your stuff
#pragma pop_macro("SendMessage")

它适用于 MSVC、GCC 和 CLANG

【讨论】:

    【解决方案2】:

    我有一个模糊的方法来解决它。

    检查使用#ifdef..

    如果是这样,请在调用您的函数之前使用“#undef”取消定义它。

    【讨论】:

    • 如果我有多个宏命名冲突,我必须#undef所有吗?
    • 是的,你不需要#ifdef
    • 我不确定还有其他方法。另外我不确定命名空间是否有效。试试看。
    • 命名空间不起作用,宏在命名空间之前被解析。
    猜你喜欢
    • 2011-10-25
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 2019-08-18
    • 1970-01-01
    • 2022-11-04
    相关资源
    最近更新 更多