导入模块的标准方式

Ger*_*501 8 c++ c++20 c++-modules

我目前正在尝试在应该在 Windows (MSVC) 和 Linux (Clang 和/或 GCC) 上编译的代码中使用 c++ 模块。

我目前正在 Visual Studio 中进行开发,并使用“标准一致性模式”(/permissive-) 使我的代码尽可能可移植。

但是下面的代码:

import std.core;
int main()
{
    std::cout << "Hello, World! haha" << std::endl;

    std::vector<int> myVec{4};

    std::map<std::string, size_t> myMap;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

无法使用 /permissive- 标志进行编译。我收到以下错误:

E3223 找不到要导入的模块文件“std.core”

错误 C2664:“int _CrtDbgReport(int,const char *,int,const char *,const char *,...)”:无法将参数 4 从“int”转换为“const char *”

我认为“std.core”可能仅适用于 Windows,因此我尝试了以下操作(我在许多示例中都看到了):

import <iostream>;
import <vector>;
import <map>;
Run Code Online (Sandbox Code Playgroud)

但它会导致以下错误:

错误 C7612:找不到“PATH_TO_VS\include\iostream”的标头单元

错误 C7612:找不到“PATH_TO_VS\include\vector”的标头单元

错误 C7612:找不到“PATH_TO_VS\include\map”的标头单元

注意:PATH_TO_VS\include 中实际上有名为“iostream”、“vector”和“map”的文件。

因此我想知道导入 c++ 模块的标准方法是什么?如果“import std.core”是标准方式,为什么不使用 /permissive- 进行编译?

我正在使用 Visual Studio 2019(社区)和 CMake。

编辑:

对不起,我忘了告诉我的编译器标志:

/experimental:module
/std:c++latest
/W4
/WX
/permissive-
/MDd
/EHsc
Run Code Online (Sandbox Code Playgroud)

代码在没有 /permissive- 的情况下编译,但在设置时不会。我不明白为什么

Jer*_*ten 9

根据 Microsoft Docs,尚未实施导入标头。请参阅https://docs.microsoft.com/en-us/cpp/cpp/modules-cpp?view=msvc-160#imported-header-files

您可以在此处关注此功能的进展:https : //github.com/microsoft/STL/issues/60

您可以使用import std.core;Visual Studio 2019 中的语法(我使用 v16.8+ 对此进行了测试),但您还需要在 Visual Studio 安装程序中安装“ C++ Modules for v142 build tools ”组件才能使其正常工作。

此外,您需要启用以下标志:

  • /std:c++latest
  • /experimental:module

本答案所述

C5050导入std.core模块时,您可能仍会收到一些有关不兼容环境的警告:

1>C:\Test\C++\Modules\main.cpp(1,16): warning C5050: Possible incompatible environment while importing module 'std.core': _GUARDOVERFLOW_CRT_ALLOCATORS=1 is defined in current command line and not in module command line
1>C:\Test\C++\Modules\main.cpp(1,16): warning C5050: Possible incompatible environment while importing module 'std.core': _DEBUG is defined in current command line and not in module command line
1>C:\Test\C++\Modules\main.cpp(1,16): warning C5050: Possible incompatible environment while importing module 'std.core': _M_FP_PRECISE is defined in current command line and not in module command line
Run Code Online (Sandbox Code Playgroud)
  1. 要解决第一个警告,请将SDL Checks更改为No ( /sdl-)。
  2. 要解决第二个警告,请删除_DEBUG预处理器定义。
  3. 要解决第三个警告,请删除浮点模型的值(/fp:percise在我的情况下,默认情况下设置为)。


Kar*_*rlM 4

根据https://learn.microsoft.com/en-us/cpp/cpp/modules-cpp?view=vs-2019 你需要使用编译器开关

  • /实验:模块
  • /std:c++最新
  • /EHSc
  • /MD

以及配置对该项目的实验模块支持。