22

从 clang 的 C++11 支持状态网站http://clang.llvm.org/cxx_status.html中可以看出,从 3.1 版开始,“Initializer List”和“Lambda Expression”都受支持。

但是,使用 LLVM/Clang 主干 (3.2),针对初始化列表和 lambda 表达式进行编译将产生错误消息。

有谁知道 Clang >3.1 是否支持这些功能?

4

2 回答 2

32

默认情况下,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++如果您是使用它。

于 2012-05-15T14:23:57.277 回答
0

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 版本控制比我意识到的更复杂。

于 2012-05-15T15:28:39.520 回答