You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者αλεχολυτ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:45:04