C++20模块如何解决不同模块同名函数问题?含实例疑问
C++20模块同名导出函数与跨模块函数实现的规则解析
1. 同时导入含同名导出函数的模块后,直接调用func()的行为
按照C++20标准,当一个模块(如mod3)同时导入多个导出了同名非限定函数的模块(mod1和mod2都导出func())时,直接在代码中使用func()属于名称歧义,编译器必须触发编译错误,而非默认选择某一个模块的函数。
你在VS2022+MSVC环境中观察到调用mod1的func(),这是MSVC的非标准行为,不符合C++20的规范要求。标准明确规定这种未限定的同名导入会导致歧义,无法通过编译。
正确的做法是通过模块限定名明确指定要调用的函数:
// mod3中明确调用mod1的func() void func3() { mod1::func(); } // 或者调用mod2的func() void func3() { mod2::func(); }
2. mod3.cpp中的goo()是否是mod2.ixx中声明的goo()的实现?
答案是否定的,除非mod3.cpp是mod2的模块实现单元。
C++20模块的核心规则:
- 模块接口单元(如mod2.ixx)中声明的
export函数,其实现必须放在同一个模块的实现单元中——也就是开头声明了module mod2;的.cpp文件,而非其他模块(如mod3)的代码文件。 - 如果mod3.cpp中没有声明
module mod2;,那么这里定义的goo()属于mod3模块(或全局命名空间)的独立函数,和mod2.ixx中声明的goo()是完全不同的实体。这种情况下,若mod2的接口声明了export void goo();但未提供实现,链接时会报未定义符号错误;若mod3的goo()也被导出,还可能引发重复定义问题。
只有当mod3.cpp的开头写了module mod2;(即作为mod2的实现单元),此时定义的goo()才是mod2.ixx中声明的那个函数的实现。
内容的提问来源于stack exchange,提问作者Nekomiya Kasane
相关产品推荐
相关产品推荐

