【问题标题】:How do I re-enable C++17 removed features in clang?如何在 clang 中重新启用 C++17 已删除的功能?
【发布时间】:2021-09-09 09:52:10
【问题描述】:

我有一些作为大型项目的一部分构建的 3rdparty 库。一些库需要 C++17,其他库需要 C++17 中删除的功能(std::auto_ptrstd::fun_ptr)。

对于这个项目,使用了 Clang(版本 11)。如果我使用 clang 定义 _LIBCPP_ENABLE_CXX17_REMOVED_FEATURES,搜索所需版本的不匹配应该不是问题。

但是,这效果为零。我在一个很小的测试样本中尝试了这个定义:

#include <memory>

int main(void)
{
    std::auto_ptr<int> thing(new int(1));
    return 0;
}

不指定 C++ std,它编译得很好。

但是,如果我指定 C++17,它会失败并显示 -D_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES

PS E:\> clang++ -std=c++17 -D_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES .\autoptr.cpp
.\autoptr.cpp:5:10: error: no member named 'auto_ptr' in namespace 'std'
    std::auto_ptr<int> thing(new int(1));
    ~~~~~^
.\autoptr.cpp:5:22: error: expected '(' for function-style cast or type construction
    std::auto_ptr<int> thing(new int(1));
                  ~~~^
.\autoptr.cpp:5:24: error: use of undeclared identifier 'thing'
    std::auto_ptr<int> thing(new int(1));
                       ^
3 errors generated.

Clang 中是否不再提供 c++17 删除的功能,还是我需要额外的编译器选项?

Clang 版本:

PS E:\> clang++ -v
clang version 11.1.0
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Program Files\LLVM\bin

编辑: 有趣的是,这在我拥有的不同系统上编译得很好。无需额外定义。

#@#:~/kraken$ clang++ -v
clang version 10.0.0-4ubuntu1~18.04.2
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

编辑2: 从 11.1.0 升级到 12.0.1。没有变化

$ clang++ -v -stdlib=libc++ -std=c++17 -D_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES -D_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR autoptr.cpp
clang version 12.0.1
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Program Files\LLVM\bin
clang++: warning: argument unused during compilation: '-stdlib=libc++' [-Wunused-command-line-argument]
 "C:\\Program Files\\LLVM\\bin\\clang++.exe" -cc1 -triple x86_64-pc-windows-msvc19.29.30038 -emit-obj -mrelax-all -mincremental-linker-compatible --mrelax-relocations -disable-free -disable-llvm-verifier -discard-value-names -main-file-name autoptr.cpp -mrelocation-model pic -pic-level 2 -mframe-pointer=none -fmath-errno -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -tune-cpu generic -v -resource-dir "C:\\Program Files\\LLVM\\lib\\clang\\12.0.1" -D _LIBCPP_ENABLE_CXX17_REMOVED_FEATURES -D _LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR -internal-isystem "C:\\Program Files\\LLVM\\lib\\clang\\12.0.1\\include" -internal-isystem "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Professional\\VC\\Tools\\MSVC\\14.29.30037\\include" -internal-isystem "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Professional\\VC\\Tools\\MSVC\\14.29.30037\\atlmfc\\include" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.19041.0\\ucrt" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.19041.0\\shared" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.19041.0\\um" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.19041.0\\winrt" -std=c++17 -fdeprecated-macro -fdebug-compilation-dir "E:\\" -ferror-limit 19 -fno-use-cxa-atexit -fms-extensions -fms-compatibility -fms-compatibility-version=19.29.30038 -fdelayed-template-parsing -fcxx-exceptions -fexceptions -faddrsig -o "C:\\Users\\JONATH~1.NOB\\AppData\\Local\\Temp\\autoptr-152d67.o" -x c++ autoptr.cpp
clang -cc1 version 12.0.1 based upon LLVM 12.0.1 default target x86_64-pc-windows-msvc
#include "..." search starts here:
#include <...> search starts here:
 C:\Program Files\LLVM\lib\clang\12.0.1\include
 C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30037\include
 C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30037\atlmfc\include
 C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt
 C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\shared
 C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um
 C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\winrt
End of search list.
autoptr.cpp:5:10: error: no member named 'auto_ptr' in namespace 'std'
    std::auto_ptr<int> thing(new int(1));
    ~~~~~^
autoptr.cpp:5:22: error: expected '(' for function-style cast or type construction
    std::auto_ptr<int> thing(new int(1));
                  ~~~^
autoptr.cpp:5:24: error: use of undeclared identifier 'thing'
    std::auto_ptr<int> thing(new int(1));
                       ^
3 errors generated.

此输出显示了问题。未使用 LLVM libcxx。使用 -D_HAS_AUTO_PTR_ETC=1 为我解决了这个问题。

【问题讨论】:

  • 老实说,你不应该使用任何依赖 auto_ptr 的库...你当然可以在网上找到更好的开源库。
  • 在将我们的项目迁移到 C++17 时,我们遇到了与使用 std::binary_function 的库类似的问题。幸运的是,我们能够将其包装/隔离为解决方法。
  • 您可以使用std::unique_ptr 轻松定义自己的auto_ptr。丑陋的解决方案,但有效。顺便说一句 auto_ptr 被删除了 c++14 所以试试 _LIBCPP_ENABLE_CXX14_REMOVED_FEATURES
  • @regomodo: "需要在 C++17 中被弃用的特性(std::auto_ptr, std::fun_ptr" 它们在 C++ 中没有被“弃用” 17;它们已从 C++17 中删除。“已弃用”表示“可用但不建议”。

标签: c++ clang c++17 auto-ptr


【解决方案1】:

使用 clang 的 -v 标志检查哪个 c++ 标准库正在使用。我假设正在使用 llvm 的 libcxx,因为 -stdlib=libcxx 被忽略了。事实上,msvc 的 stdlib 正在被使用。与 msvc 一起使用:

clang++ -std=c++17 -D_HAS_AUTO_PTR_ETC=1 file.cpp

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 2012-05-11
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    相关资源
    最近更新 更多