导入模块的标准方法
Standard way of importing 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;
}
无法使用/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
- 要解决第一个警告,请将SDL 检查更改为否(
/sdl-
(。 - 若要解决第二个警告,请删除
_DEBUG
预处理器定义。 - 要解决第三个警告,请删除浮点模型的值(默认情况下,在我的情况下设置为
/fp:precise
(。
根据 https://learn.microsoft.com/en-us/cpp/cpp/modules-cpp?view=vs-2019 您需要使用编译器开关
- /实验性:模块
- /std:c++latest
- /EHsc
- /医学博士
以及为项目配置实验模块支持。
- 没有取消引用/解包对象的标准方法?
- 是否有一种标准方法来计算两个 asctime() 值之间的天数
- 循环遍历标准的正确方法::array<char*, N>
- 连接和压缩标准::vector<std::字符串的最佳方法>
- 导入模块的标准方法
- 有没有一种标准方法可以在C++中获取第 n 个"下一个"浮点值
- C++ 捕获异常后进行清理的标准方法是什么?
- memcpy 是将浮子打包到 uint32 中的标准方法吗?
- 将积分类型的数组作为另一个不相关的积分类型的阵列进行访问的安全且符合标准的方法
- 读取二进制文件的惯用C++17标准方法是什么
- 在 c++ 中创建 dll 并在 delphi 中调用的标准方法
- 在 NTL 中构造多项式的标准方法是什么?
- 关于异常,覆盖标准异常方法
- C 是否具有对两个STD :: sets,vectors等进行三角比较的标准方法
- 在C++中编写符合 IEEE-754 标准的双/浮子除法的最快方法是什么?
- 列出 n 个对象的所有 k 排列的有效方法,同时满足特定标准
- 是否有符合标准的方法来确定非静态杆件的对齐方式?
- 获取非专用标准::矢量容器的标准方法<bool>
- 一种安全、符合标准的方法,使类模板专用化仅在实例化时才无法使用"static_assert"进行编译
- 在 C++ 中执行此操作的视觉更好方法?标准::字符串