【问题标题】:Call a member function with the same name as macro调用与宏同名的成员函数
【发布时间】:2022-01-08 10:45:22
【问题描述】:

考虑以下几点:

struct S {
    void f() {}
};

#define f 42

int main() {
    S s;
    s.f(); // error: expected unqualified-id
}

如何在不取消定义宏f 或更改成员函数名称的情况下调用成员函数S::f?有没有可能?

如果宏定义为#define f() 42(带括号),我可以像(s,f)() 那样解决问题。但是宏定义中没有括号。

【问题讨论】:

  • 这能回答你的问题吗? Macro and function with same name
  • 将 #define f 42 更改为 constexpr auto f = 42;
  • 只是macros are evil的原因之一。
  • 曾几何时,我年轻的时候,将一个变量命名为strlen。不好的举动。 strlen“函数”被实现为一个宏,而不是得到一个“嘿,傻瓜,strlens 已经在使用”错误,我得到了十几页完全无意义的错误诊断。
  • 您是否可以更改S 的定义?你能添加另一个成员函数到S,它只调用f吗?

标签: c++ macros member-functions


【解决方案1】:

如何在不取消定义宏 f 或更改成员函数名称的情况下调用成员函数 S::f?有可能吗?

这在标准 C++ 中是不可能的。

诸如此类的问题是每个人都建议避免使用宏的原因,并将宏标识符和非宏标识符之间的命名约定分开。

然而,在非标准 C++ 中,这是可能的。使用push and pop macro 语言扩展的示例:

#pragma push_macro("f")
#undef f
s.f();
#pragma pop_macro("f")

但是根据 Unicode 设置,SendMessage 等 WinAPI 宏扩展为 SendMessageA 或 SendMessageW。

当您包含系统标头时,围绕各种系统标头中定义的宏跳舞是严酷的现实。遇到这些情况时,通常最好避免使用冲突的标识符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-12
    • 2023-03-18
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    相关资源
    最近更新 更多