【问题标题】:Standard way of importing modules导入模块的标准方式
【发布时间】:2020-04-14 06:19:18
【问题描述】:

我目前正在尝试在应在 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 *,const char *,...)': 无法将参数 4 从 'int' 转换为 'const char *'

我认为“std.core”可能是一个仅限 Windows 的东西,所以我尝试了以下方法(我在很多示例中都看到过):

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

但是会导致如下错误:

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

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

【问题讨论】:

  • std.core 不是 Windows 的东西。
  • 只有 import&lt;&gt; 语法是标准库的 C++20 的一部分。 (用户编写的模块可以通过import foo;使用。)

标签: c++ c++20 c++-modules


【解决方案1】:

根据 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

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

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

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

this answer中所述。

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

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
  1. 为了解决第一个警告,将 SDL Checks 更改为 No (/sdl-)。
  2. 要解决第二个警告,请删除 _DEBUG 预处理器定义。
  3. 要解决第三个警告,请删除 浮点模型 的值(在我的例子中,默认设置为 /fp:percise)。

【讨论】:

  • 我遇到了类似的问题。我没有禁用 SDL 检查,而是使用 #pragma warning(disable: 5050)#pragma warning(disable: 4996) 禁用了警告
【解决方案2】:

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

  • /experimental:模块
  • /std:c++latest
  • /EHsc
  • /MD

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

【讨论】:

  • 感谢您的回复。在配置 Visual Studio 时,我正在使用您提到的标志并安装了 c++ 模块支持。您能否解释一下“为项目配置实验模块支持”的意思。 ?我是使用 Visual Studio 编程的新手,因为我使用的是 CMake,所以到目前为止我不需要配置任何东西。
  • 如果您阅读链接,它会显示“在 Visual Studio 项目中,右键单击解决方案资源管理器中的项目节点并选择属性。将配置下拉菜单设置为所有配置,然后选择配置属性 > C/C++ > 语言 > 启用 C++ 模块(实验性)。"
  • 祝你圣诞快乐。不幸的是,我不得不删除标志 /permissive-。我会不做的:)
  • 别忘了实际安装 c++ 新模块库,否则没有编译器开关会拯救你的灵魂 :)
猜你喜欢
  • 2016-04-25
  • 2021-05-19
  • 1970-01-01
  • 2020-11-13
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多