我有两个问题:
第一个问题:
我想创建一个类型的对象
std :: filesystem :: path
我希望在不通过 boost 的情况下执行此操作,因为标准 C 17 允许这样做。
boost 的优势在于我们可以做到:
#include <boost / filesystem / path.hpp>
因此它允许您准确地包含您想要的内容。
但如果我一开始就这样做:
#include <filesystem>
那么在这种情况下,它在处理后的代码中包含了很大一部分不会被使用的代码(但我不确定这种说法)。
那么,我的第一个问题:是否可以仅包含 C++17 标准的文件系统类“路径”?
我看了:
https://en.cppreference.com/w/cpp/header/filesystem
还有很多我不需要的类(class)。我只需要“路径”。
如何在不涉及boost的情况下只集成路径?
我想,万一有可能,在 C 17 中使用 if 文件系统会减少预处理后获得的代码?
谢谢
最佳答案
标准要求 path
至少在 <filesystem>
中向前声明,参见:29.11.5 Header <filesystem>
synopsis .实际上,这取决于您的编译器在哪里 std::filesystem::path
已声明,因此,您应该只包含 <filesystem>
.
我也觉得只需要包括 <boost/filesystem/path.hpp>
就编译时间而言,比必须包含“全部”<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>
几乎是包含“仅”<boost/filesystem/path.hpp>
的两倍.为了进一步证实编译时间的增加可以归因于 Boost 实现而不是其他一些晦涩的原因,我检查了由于包含 <boost/filesystem/path.hpp>
而需要预处理的头文件的数量。和 <filesystem>
分别是:
$ 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>
如果是您担心的编译时间。
关于c++ - 如何在 C++17 中不包含完整文件系统头的情况下使用文件系统的类路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58428356/