1

注意:这不会失败#include <filesystem>。后来失败了。

我在 macOS 10.15 上,使用 clang 11。输出clang --version

Apple clang version 11.0.0 (clang-1100.0.33.17)
Target: x86_64-apple-darwin19.4.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

当我尝试编译一些简单的东西时:

#include <filesystem>

using namespace std;

filesystem::path dev_dir;

int main() {
    dev_dir = "/dev/";
    return 0;
}

编译器确实找到了文件系统库,但无法识别命名空间:

$clang trigger_controller.cpp -o trigger_controller

trigger_controller.cpp:##:##: error: use of undeclared identifier 'filesystem'
filesystem::path dev_dir;

这是我认为我正在尝试包含的文件(我已确认存在):

// /usr/local/include/c++/9.2.0/filesystem

#ifndef _GLIBCXX_FILESYSTEM
#define _GLIBCXX_FILESYSTEM 1

#pragma GCC system_header

#if __cplusplus >= 201703L

#include <bits/fs_fwd.h>
#include <bits/fs_path.h>
#include <bits/fs_dir.h>
#include <bits/fs_ops.h>

#define __cpp_lib_filesystem 201703

#endif // C++17

#endif // _GLIBCXX_FILESYSTEM

我究竟做错了什么?我需要特定的编译器选项吗?命名空间错了吗?

4

1 回答 1

1

是的,您需要特定的编译器选项。请注意,除了样板之外,此标头的全部内容都包含在#if __cplusplus >= 201703L...#endif块中。这意味着标题实际上是空的,除非编译器声明符合 C++ 标准的 2017 修订版(或更高版本)。

对于 clang 和 gcc,标准一致性级别由命令行选项控制-std。GCC 的这个选项的文档在这里;我不知道在哪里可以找到 clang 的文档,但是 clang 通常会尝试与 gcc 命令行兼容,因此相同的选项应该可以工作。

在这种情况下,您应该使用的确切选项是-std=gnu++17C++ 2017。在撰写本文时,对 C++ 标准更新版本的支持仍然是“实验性的”并且“几乎肯定会以不兼容的方式发生变化”,所以我会避免它。我还建议您避免使用这种模式的超一致性变体-std=c++17,因为它很有可能暴露 MacOS 系统头文件中的错误。

于 2020-06-16T15:26:20.683 回答