gpt4 book ai didi

C++ 模块 : do included 3rd party files still pull in normal headers if a standard library module is included first?

转载 作者:行者123 更新时间:2023-12-03 06:52:25 24 4
gpt4 key购买 nike

我开始尝试 Microsoft Visual Studio 的 C++ 模块实现。 Microsoft splits the standard library into five modules :

  • 标准正则表达式
  • 标准文件系统
  • 标准内存
  • 标准线程
  • 标准核心

  • 我已经用上述模块替换了我的标准库,适用于我项目中的每个文件。但是,我包含了许多第三方库文件。例如,一个第三方库有一个 #include <memory>在头文件中,我已经有了 import std.memory;在我的文件中包含第三方库的头文件之前。 std.memory模块定义了包含保护,这将导致第三方库跳过不必要的 #include <memory>或者它是否包括内存,即使模块覆盖 <memory>已经被收录了?
    标准对此有什么要说的吗?这似乎是向模块过渡期间的一个重要问题:如果使用第三方库,如果它们的包含仍然像以前一样出现,那么对模块的好处似乎会大大降低。

    最佳答案

    C++20 根本没有为标准库指定模块。相反,它指定(大部分)库 标题 可导入:import<vector>;等等。因此,标准库组件附加到 的情况都是如此。全局模块 ,在这种情况下,假设 C++23 std.vector模块接口(interface)单元可能很简单

    module;
    #include<vector>
    export module std.vector;
    namespace std {
    export using std::vector;
    }
    甚至
    export module std.vector;
    export import<vector>;
    或者它们附加到 命名模块 , 在这种情况下,标题 <vector>可能只是
    import std.vector;
    (加上功能测试宏)。
    在这两种情况下都不做 休息 如果一个翻译单元两者都做
    import std.vector;
    #include<vector>
    可能发生在 #include包含每一行的头文件: std::vector 的两个定义位于不同的翻译单元中,就像 #include<vector> 的两个 C++98 翻译单元.还有 的问题效率 : 使用前一种策略,翻译单元可以到 import#include相同的组件,并且命名模块不能提供宏来防止重新解析它。然而,使用这种策略的实现可能会选择 翻译 #include进入 import<vector>;为了避免这种情况。
    请注意,与 MSVC 的实现一样,C++23 标准库模块可能是 。较粗的 比标题,因此上述适用于(比如说) std.containers<vector> , <deque> , <map>等统称。

    关于C++ 模块 : do included 3rd party files still pull in normal headers if a standard library module is included first?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63836931/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com