导入模块的标准方法

Standard way of importing modules

本文关键字:方法 标准 模块 导入      更新时间:2023-10-16

我目前正在尝试在应该在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;
}

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

E3223 找不到要导入的模块文件"std.core">

错误 C2664: 'int _CrtDbgReport(int,const char *,int,const char *,常量字符 *,...(':无法将参数 4 从"int"转换为"常量字符 *">

我很难说"std.core"可能是一个只有Windows的东西,所以我尝试了以下内容(我在许多例子中看到它(:

import <iostream>;
import <vector>;
import <map>;

但它会导致以下错误:

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

错误 C7612:找不到 的标头单元 'PATH_TO_VS\包含\矢量'

错误 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

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

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

您可以在此处跟踪此功能的进度:https://github.com/microsoft/STL/issues/60。

您可以在Visual Studio2019中使用import std.core;语法(我在v16.8+中对此进行了测试(,但您还需要在Visual Studio Installer中安装">v142构建工具的C++模块"组件才能正常工作。

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

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

如本回答所述。

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

1>C:TestC++Modulesmain.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:TestC++Modulesmain.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:TestC++Modulesmain.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
  1. 要解决第一个警告,请将SDL 检查更改为(/sdl-(。
  2. 若要解决第二个警告,请删除_DEBUG预处理器定义。
  3. 要解决第三个警告,请删除浮点模型的值(默认情况下,在我的情况下设置为/fp:precise(。

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

  • /实验性:模块
  • /std:c++latest
  • /EHsc
  • /医学博士

以及为项目配置实验模块支持。