如何在 C++17 中不包含完整文件系统头的情况下使用文件系统的 class 路径?

How to use the class path of filesystem without including the complete filesystem header in C++17?

我有两个问题:

第一个问题:

我想创建一个

类型的对象
std :: filesystem :: path

我希望不通过 boost 来完成它,因为标准 C 17 允许这样做。

boost 的优势在于我们可以做到:

#include <boost / filesystem / path.hpp>

所以它允许您准确地包含您想要的内容。

但如果我一开始就这样做:

#include <filesystem>

那么在这种情况下,它在处理后的代码中包含了很大一部分不会使用的代码(但我不确定这种说法)。

所以,我的第一个问题:是否可以仅包含 C++17 标准的文件系统的 class "path"?

我看了:

https://en.cppreference.com/w/cpp/header/filesystem

还有很多 class 我不需要。我只需要 "path".

如何在不涉及boost的情况下只集成路径?

我想,万一有可能,在 C 17 中使用 if 文件系统会减少预处理后获得的代码?

谢谢

标准要求 path 至少在 <filesystem> 中向前声明,参见:29.11.5 Header <filesystem> synopsis。实际上,这将取决于您的编译器在哪里声明了 std::filesystem::path,因此,您应该只包含 <filesystem>.

我也觉得只需要包含 <boost/filesystem/path.hpp> 就编译时间而言比必须包含 'all of' <fileysystem> 更便宜,但测量它给出了令人惊讶的结果,至少在我的机器上,对于 std::filesystem:

$ echo '#include <filesystem>' | time -p g++ -std=c++17 -x c++ -c -
real 0.49
user 0.43
sys 0.05

与仅包括 <boost/filesystem/path.hpp>:

$ echo '#include <boost/filesystem/path.hpp>' | time -p g++ -std=c++17 -x c++ -c -
real 0.89
user 0.81
sys 0.07

所以包含 <filesystem> 的速度几乎是包含 'only' <boost/filesystem/path.hpp> 的两倍。为了进一步证实编译时间的增加可以归因于 Boost 实现而不是其他一些晦涩的原因,我检查了由于包含 <boost/filesystem/path.hpp> 和 [=15= 而需要预处理的头文件的数量] 分别是:

$ echo '#include <boost/filesystem/path.hpp>' | g++ -std=c++17 -x c++ -M -c - | wc -l
407

对比:

$ echo '#include <filesystem>' | g++ -std=c++17 -x c++ -M -c - | wc -l
144

我认为可以安全地得出结论,如果您担心的是编译时间,则不必担心包含 <filesystem>