C++中宏名与类成员函数重名时如何不取消宏调用对应函数
问题解答
是可以调用的,核心原理是:C/C++的宏替换仅发生在预处理阶段,只会替换独立的、没有被命名空间/类作用域限定的标识符,类限定名S::f中的f不会被预处理器识别为宏f进行替换,我们可以利用这一特性规避冲突。
实现方案
方案1:通过成员函数指针调用(全版本C++通用)
int main() { S s; // 先获取成员函数指针,此处S::f不受宏替换影响 void (S::*f_ptr)() = &S::f; // 通过成员指针调用目标函数 (s.*f_ptr)(); // 也可以合并为一行写法 (s.*&S::f)(); }
方案2:使用std::invoke(C++17及以上版本适用)
引入标准库的调用工具,不需要手动声明成员函数指针,写法更简洁:
#include <functional> int main() { S s; std::invoke(&S::f, s); }
原代码报错原因
原写法s.f()中的f是无作用域限定的独立标识符,预处理阶段会被直接替换为42,代码变为s.42(),不符合C++语法规则,因此编译报错。
内容的提问来源于stack exchange,提问作者αλεχολυτ
相关产品推荐
相关产品推荐

