【发布时间】:2012-05-23 00:18:07
【问题描述】:
来自 clang 的 C++11 支持状态网站 http://clang.llvm.org/cxx_status.html ,它说,“初始化列表”和“Lambda 表达式”从 3.1 版本开始都支持。
但是,使用 LLVM/Clang 中继 (3.2),针对初始化列表和 lambda 表达式进行编译会产生错误消息。
有谁知道 Clang >3.1 是否支持这些功能?
【问题讨论】:
来自 clang 的 C++11 支持状态网站 http://clang.llvm.org/cxx_status.html ,它说,“初始化列表”和“Lambda 表达式”从 3.1 版本开始都支持。
但是,使用 LLVM/Clang 中继 (3.2),针对初始化列表和 lambda 表达式进行编译会产生错误消息。
有谁知道 Clang >3.1 是否支持这些功能?
【问题讨论】:
默认情况下,clang++ 不会启用 C++11 功能 - 你有 to pass an additional flag during compilation。
clang++ -std=c++11 [input files...]
或者
# enables some additional C++11 extensions GCC has
clang++ -std=gnu++11 [input files...]
此外,您可以在使用 libstdc++ 和 Clang 自己的 libc++ 之间切换,它们是 C++ 标准库的不同实现。 libc++ 在某些情况下可能比您现有的 libstdc++ 库更好地实现 C++11 标准。
# uses clang's C++ library in C++98 mode
clang++ -stdlib=libc++ [input] # uses clang's C++ library
# uses clang's C++ library and enables C++11 mode
clang++ -stdlib=libc++ -std=c++11 [input]
如果您在具有过时版本的 libstdc++(如 Mac OSX)的环境中使用 Clang,后者很重要,但请注意这两个 C++ 库彼此不兼容,因此您必须重新构建如果您要使用它,则对 libc++ 的任何依赖项。
【讨论】:
C++11 模式。 gnu++11 用于启用可能是内部代码和 glibc 所需的一些 GNU 扩展(可能是 gnu90 或 gnu99)。
-std 命令行开关不会启用提问者询问的功能,因为clang 还不支持这些功能。
http://clang.llvm.org/cxx_status.html 的页面充其量是令人困惑的。目前,发布的 3.1 版本不支持初始化列表或 lambdas(所以我暂时切换回 GCC 4.8)。
根据此处的说明,您始终可以使用__has__feature 宏检查对功能的clang 支持:
http://clang.llvm.org/docs/LanguageExtensions.html#checking_language_features
例如,__has_feature(cxx_generalized_initializers) 或 __has_feature(cxx_lambdas) 将在这些功能可用并启用时返回 true。
就我个人而言,我预计 clang 4.0 将准备好这些功能,预计将与下一个 Xcode 一起发布(可能是 2012 年 6 月)。
-- 为澄清我一直在测试的版本进行了编辑--显然,clang 版本控制比我意识到的要复杂。
【讨论】:
c++ --version 说Apple clang version 3.1 (tags/Apple/clang-318.0.58) (based on LLVM 3.1svn) -- 那不是clang 3.1吗?
Apple clang 版本与 Clang 版本不同。 LLVM 3.1svn 表示这是 3.0 和 3.1 版本之间某个时间的 SVN 快照。我不确定那是多少岁,但它似乎至少从 2 月就已经存在了。