从 clang 的 C++11 支持状态网站http://clang.llvm.org/cxx_status.html中可以看出,从 3.1 版开始,“Initializer List”和“Lambda Expression”都受支持。
但是,使用 LLVM/Clang 主干 (3.2),针对初始化列表和 lambda 表达式进行编译将产生错误消息。
有谁知道 Clang >3.1 是否支持这些功能?
从 clang 的 C++11 支持状态网站http://clang.llvm.org/cxx_status.html中可以看出,从 3.1 版开始,“Initializer List”和“Lambda Expression”都受支持。
但是,使用 LLVM/Clang 主干 (3.2),针对初始化列表和 lambda 表达式进行编译将产生错误消息。
有谁知道 Clang >3.1 是否支持这些功能?
默认情况下,clang++
不会启用 C++11 功能 - 您必须在编译期间传递一个附加标志。
clang++ -std=c++11 [input files...]
或者
# enables some additional C++11 extensions GCC has
clang++ -std=gnu++11 [input files...]
libstdc++
此外,您可以在 using和 Clang's own之间切换libc++
,它们是 C++ 标准库的不同实现。libc++
在某些情况下,C++11 标准的实现可能比您现有的libstdc++
库更好。
# 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++
如果您是使用它。
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)
or将返回 true。__has_feature(cxx_lambdas)
就我个人而言,我预计这些功能将在 clang 4.0 中准备好,预计将与下一个 Xcode 一起发布(可能是 2012 年 6 月)。
-- 编辑澄清我一直在测试的版本 -- 显然,clang 版本控制比我意识到的更复杂。