调用与宏同名的成员函数
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 中定义的宏周围跳舞是残酷的现实。遇到这些时,通常最好避免使用冲突的标识符。
考虑以下几点:
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 中定义的宏周围跳舞是残酷的现实。遇到这些时,通常最好避免使用冲突的标识符。