问题 在Visual Studio中的clang中启用C ++ 14


我已经安装了clang 3.7并且我正在使用visual studio。当我尝试编译时:

auto f()
{
return 2;
}

我收到错误,说这是C ++ 14的未来。我试图通过:
-std = c ++ 14作为编译器参数,但后来我收到错误:

错误1错误:未知参数:' - std = c ++ 14' C:\ Users ... \ visual studio 2013 \ Projects \ ConsoleApplication8 \ ConsoleApplication8 \ clang-cl.exe ConsoleApplication8。 

有关在Visual Studio 2013下如何在clang中启用c ++ 14功能的任何想法?

编辑:
我必须补充一点,我能够在Visual Studio下使用这个编译器编译和构建c ++ 11代码,没有任何问题。


13120
2018-04-29 18:10


起源

读 llvm.org/docs/GettingStartedVS.html 让我想到:你有一颗勇敢的心 - Dieter Lücking


答案:


clang-cl 不使用与传统clang相同的选项语法 - 它应该模仿Visual Studio cl 命令行,不是 clang的命令行。

例如,来自 clang-cl文件

CL.EXE COMPATIBILITY OPTIONS:
  /?                     Display available options
  /arch:<value>          Set architecture for code generation
  /C                     Don't discard comments when preprocessing
  /c                     Compile only
  /D <macro[=value]>     Define macro
  ...

但是,他们有一些传递选项来支持像你这样的案例:

OPTIONS:
  ...
  -Xclang <arg>         Pass <arg> to the clang compiler
  -mllvm <value>        Additional arguments to forward to LLVM's option processing

所以它似乎在调用 clang-cl -Xclang -std=c++14 这将是你最好的选择。


15
2018-04-29 18:36



@andiduh嗨,我想感谢你的回答,它有效!!!非常感谢你。你知道为什么我们不能只传递-std = c ++ 14选项吗?也就是说,为什么他们没有那样,所以我们可以在没有'Xclang'的情况下使用该选项?我的意思是我们使用clang编译器,为什么不能简单地将参数传递给它? - There is nothing we can do
@Thereisnothingwecando完全猜测:垫片旨在接受VS想要将其传递给它的编译器(cl)的参数。他们没有教VS如何与铿锵语交谈,而是编写了一艘船(clang-cl),用来翻译VS用来与cl进行交谈的争论。如果你想谈谈 直 为了铿锵,你必须“逃避”你的论点。通过“任何争论clang-cl不知道是一个cl论点”来铿锵将是一个危险的混乱:白名单比黑名单更安全。 - Yakk - Adam Nevraumont


我在clang-cl工作。正如antiduh所说,clang-cl试图模仿Visual Studio clcl 直到并且包括c ++ 14没有用于启用语言模式的开关,它总是启用所有最新的东西。因此,clang-cl也是如此。 MSVC在MSVC 2015中获得了一些C ++ 14支持,因此如果您告诉clang-cl您希望它模拟MSVC 2015或更高版本,它将自动启用C ++ 14。 clang-cl默认情况下模拟系统上找到的MSVC版本。你可以明确传递 -fmsc-version=1900 强制模仿2015年,这将隐式启用C ++ 14。

从MSVC 2017开始,cl.exe支持一个 /std: 旗所以clang-cl也支持它。它可用于启用C ++ 14(最低级别),C ++ 17,C ++ 20或最新版本。

-Xclang flags是内部标志,不被视为稳定接口。所以不要使用那些。


1
2017-11-22 01:02