Visual Studio 2019:如果不先在单独的模块(Ixx)中导入cpp文件中的C++标准库声明,则无法将其`导入

2022-03-02 00:00:00 module c++ visual-studio-2019 c++20

尝试使用C++20import命令加载.cpp文件中的标准库声明时,返回编译器错误,指出找不到";头单元";。

例如,在一个文件中,假设Main.cpp,我将

import <iostream>;

int main()
{

    return 0;
}

以下编译器错误结果:

error C7612: could not find header unit for 'C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includeiostream'

但是,如果我向项目添加一个模块,比如Test.ixx,如下所示

export module Test;
import <iostream>;

然后将模块Test导入Main.cpp:

import Test;
import <iostream>;

int main()
{

    return 0;
}

那么,没问题。代码构建得很好。

这只是C++20编译器实现仍在研究的一个例子吗?到目前为止,我的印象是标准库头应该是无条件可导入的--即不需要在其他模块中使用import--但是我最近才开始尝试C++20中的新功能。

注意:我也尝试过使用其他标准库声明,例如<vector>ETC,结果相同。


解决方案

在C++20中未指定导入STL,但VS允许通过执行

import std.core;

https://docs.microsoft.com/en-us/cpp/cpp/modules-cpp?view=msvc-160中的代码段

虽然C++20标准没有指定,但Microsoft允许将其C++标准库的实现作为模块导入。通过将C++标准库作为模块导入,而不是通过头文件将其包含在#中,您可能会根据项目的大小加快编译时间。该库被组件化为以下模块:

std.regex提供标头<;regex>;的内容
std.filessystem提供标头<;filesystem>;
的内容 std.memory提供标头<;memory>;的内容
标准线程提供标头<;原子&>、<;条件_变量&>、<;未来>;、<;互斥&>、<;共享_互斥&>和<;线程&>的内容 std.core提供了C++标准库中的所有其他功能
若要使用这些模块,只需将导入声明添加到源代码文件的顶部。

相关文章