【问题标题】:Modules naming conflict模块命名冲突
【发布时间】:2021-12-23 13:29:11
【问题描述】:

有没有在不导入模块的情况下使用导出的类/函数?考虑这个例子:

System.ixx

export module System;

export class String {...};

System2.ixx

export module System2;

export class String {...};

有没有像System::StringSystem2::String 一样使用它?显然,当我导入这两个模块时,我得到一个编译器错误。

【问题讨论】:

  • 使用namespaces.
  • @Fureeish 哦,太糟糕了。我希望模块更像 Rust 的模块,并消除使用 namespace 的需要。
  • 如果有 2 个不同的库导出同名函数怎么办?你无法控制它。
  • "如果有 2 个不同的库导出同名函数怎么办?" - 这就是 namespaces 的用途。过去你会为你的库引入一个命名空间,现在你也引入它。
  • 在这种情况下 - 是的。在可见性、编译策略(和性能)和封装方面——不,它们优于#includes。

标签: c++ visual-c++ c++20


【解决方案1】:

模块改变了您从多个文件中访问代码的方式,但这就是它们所做的一切。它们(在大多数情况下)不会影响 C++ 作为一种语言的基本性质。

C++ 已经有一个工具来管理不同库和源位置之间的名称冲突:命名空间。因此,C++ 模块无需解决已经充分解决的问题。

【讨论】:

  • 让模块自动命名事物可能很方便,但这是(又是一个)为向后兼容付出的代价。幸运的是,这是一个非常小的问题,我们在讨价还价中为 using 获得了更好的行为。
  • @DavisHerring:ADL 让我不同意任何结合命名空间和模块的机制。诚然,有人可能会说 ADL 可能是一个问题,并且有更好的方法来解决它(或者在这样的世界中你会看到更多 using namespace,所以你不需要 ADL)。
猜你喜欢
  • 2016-12-06
  • 2015-08-03
  • 1970-01-01
  • 2020-03-21
  • 2019-06-04
  • 2011-08-21
  • 2011-07-17
  • 2020-09-19
相关资源
最近更新 更多