调用与宏同名的成员函数

Call a member function with the same name as macro

考虑以下几点:

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)() 那样解决问题。但是宏定义中没有括号。

How to call a member function S::f without undefining the macro f or changing member function name? Is it even possible?

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

诸如此类的问题是大家建议避免宏的原因,并且将宏和non-macro标识符的命名约定分开。

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

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

but there is WinAPI macros like SendMessage expanded to SendMessageA or SendMessageW depending on Unicode settings.

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