https://en.wikipedia.org/wiki/Clang
7 September 2017 | Clang 5.0.0 released |
19 January 2018 | Clang becomes default compiler in OpenBSD 6.3 on arm.[54] |
5 March 2018 | Clang is now used to build Google Chrome for Windows.[55] |
8 March 2018 | Clang 6.0.0 released |
5 September 2018 | Clang is now used to build Firefox for Windows.[56] |
19 September 2018 | Clang 7.0.0 released |
20 March 2019 | Clang 8.0.0 released |
1 July 2019 | Clang becomes default compiler in OpenBSD 6.6 on mips64.[57] |
19 September 2019 | Clang 9.0.0 released with official RISC-V target support.[58] |
29 February 2020 | Clang becomes the only C compiler in the FreeBSD base system, with the removal of GCC.[59] |
24 March 2020 | Clang 10.0.0 released |
2 April 2020 | Clang becomes default compiler in OpenBSD 6.7 on powerpc.[60] |
12 October 2020 | Clang 11.0.0 released |
21 December 2020 | Clang becomes default compiler in OpenBSD 6.9 on mips64el.[61] |
14 April 2021 | Clang 12.0.0 released |
4 October 2021 | Clang 13.0.0 released |
25 March 2022 | Clang 14.0.0 released |
在 Xcode 中,LLVM 编译器使用 Clang 前端(LLVM.org 上基于 C 的语言项目)来解析源代码并将其转换为临时格式。然后 LLVM 代码生成层(后端)将该临时格式转换为最终的机器代码。Xcode 还包括 LLVM GCC 编译器,它使用 GCC 编译器前端以获得最大的兼容性,以及 LLVM 后端,它利用 LLVM 的高级代码生成器。这显示了基于库的编译器开发方法的灵活性。由于采用 LLVM,Xcode 还可以使用许多其他功能,例如链接时间优化、更详细的诊断信息,甚至静态分析。
LLVM Compiler Overview
Download LLVM releases
Clang - C++ Programming Language Status
Clang implements the following published and upcoming ISO C++ standards:
Language Standard | Flag | Available in Clang? |
---|---|---|
C++98 / C++03 | -std=c++98 | Yes (other than export) |
C++11 | -std=c++11 | Clang 3.3 |
C++14 | -std=c++14 | Clang 3.4 |
C++17 | -std=c++17 | Clang 5 |
C++20 | -std=c++20 | Partial |
C++2b (tentatively C++23) | -std=c++2b | Partial |
apple clang
It's just that Apple Clang and LLVM Clang use different release cycles. So one release 13.0 is not the same as the other release 13.0...
You can compare them here
Compiler support for C++20 - cppreference.com
Compiler support for C++20 - cppreference.com
Xcode clang version record · GitHub
XcodeVersionInfo – MacPorts
Apple clang version 13.0.0 (clang-1300.0.29.3)
包括适用于 iOS 15、iPadOS 15、tvOS 15、watchOS 8 和 macOS Big Sur 11.3 的 SDK。Xcode 13 版本支持 iOS 9 及更高版本、tvOS 9 及更高版本以及 watchOS 2 及更高版本的设备上调试。
Xcode 13 需要运行 macOS 11.3 或更高版本的 Mac。
您现在可以在 Xcode 的构建设置中配置C++20
和GNU++20
C++ 语言方言。(50900425)
clang 现在支持 C++20 似然属性[[likely]]
和[[unlikely]]
. (78316737)
修复了在问题导航器中单击警告或错误时无法导航到关联的 C 或 C++ 文件的问题。(73582669) (FB8981116)
Apple clang version 13.1.6 (clang-1316.0.21.2)
包括适用于 iOS 15.4、iPadOS 15.4、tvOS 15.4、watchOS 8.5 和 macOS Monterey 12.3 的 SDK。Xcode 13.3 版本支持 iOS 15.4、iPadOS 15.4、tvOS 15.4、watchOS 8.5 及更高版本的设备上调试。Xcode 13.3 需要运行 macOS Monterey 12 或更高版本的 Mac。
新功能
已经实现了几篇 C++20 和 C++2b 论文:
using
声明现在可用于枚举、枚举类及其成员。
编译器可以根据新的文字后缀 ( , ) 推导出和类型,例如。size_t
ssize_t
uz
z
for (auto i = 0uz; i < vector.size(); ++i) {}
如果 lambda 声明不带参数,现在可以在包括可变 lambda 在内的所有上下文中省略左括号和右括号 ()。
编译器现在允许重复属性。
后面的任何尾随空格\
都不重要。
具有不同编码前缀的字符串文字的串联现在是格式错误的,例如auto s = L"" U"";
. (89022082)
已解决的问题
Clang 现在遵循 C++ 标准的要求。因此,编译器可以删除无限循环而不会产生副作用。如果您的代码具有无限循环而编译器必须保留的可观察到的副作用,请考虑使用。(84717970)[intro.progress]
-fno-finite-loops
修复了在构建包含非 ASCII 字符的文件路径的项目时发生的崩溃。(83694706)
Xcode 不再传递-stdlib=libstdc++
给 Clang,因为 Clang 在 Apple 平台上不再支持该库。如果您的项目定义了构建设置,请将其删除,因为它不再执行任何操作。(83768231)CLANG_CXX_LIBRARY
Apple clang version 12.0.5 (clang-1205.0.22.9)
包括适用于 iOS 14.5、iPadOS 14.5、tvOS 14.5、watchOS 7.4 和 macOS Big Sur 11.3 的 SDK。Xcode 12.5 版本支持 iOS 9 及更高版本、tvOS 9 及更高版本以及 watchOS 2 及更高版本的设备上调试。Xcode 12.5 需要运行 macOS Big Sur 11 或更高版本的 Mac。
新功能
libc++ 不再支持宏。改用包装的迭代器。(63088925)_LIBCPP_RAW_ITERATORS
Clang 现在从方法+new
上的可用性注释中推断出可用性-init
。由于 +new
调用 [[Foo alloc] init]
, +new
除非可用,否则 +init
不可用。(75884815)
在使用 libc++ 调试 C++ 程序时,LLDB 现在为 STL 容器和算法提供改进的表达式评估支持。(19866497)
您可以调用 STL 容器的成员函数,即使它们从未在目标程序中被调用。
LLDB 可以从标准库中实例化模板函数。这包括诸如、、等算法。std::sort
std::count
std::count_if
Apple clang version 11.0.0 (clang-1100.0.33.8)
可在 Mac App Store 中获得,包括适用于 iOS 13、macOS Catalina 10.15、watchOS 6 和 tvOS 13 的 SDK。Xcode 11 支持对运行 iOS 13.1 的设备进行开发。Xcode 11 支持 iOS 8 及更高版本、tvOS 9 及更高版本以及 watchOS 2 及更高版本的设备上调试。Xcode 11 需要运行 macOS Mojave 10.14.4 或更高版本的 Mac。
Clang 现在提供了一种控制退出时间析构函数注册的机制。您可以使用 flag 全局禁用这些-fno-c++-static-destructors
,或应用该属性来禁用特定变量的析构函数。还添加了该属性以在使用时启用特定变量的析构函数。(21734598)[[clang::no_destroy]]
[[clang::always_destroy]]
-fno-c++-static-destructors
作为扩展,现在所有语言模式都支持具有固定基础类型的 C++11 枚举。(43831380)
当使用活动标准版本中已弃用的标准库设施时,将发出弃用警告。(46881474)
默认情况下,堆栈检查在所有平台上都是打开的,以防止内存损坏。(25859140)
Apple clang version 11.0.3 (clang-1103.0.32.62)
可在 Mac App Store 中获取,包括适用于 iOS 13.5、iPadOS 13.5、tvOS 13.4、watchOS 6.2 和 macOS Catalina 10.15.4 的 SDK。Xcode 11.5 版本支持 iOS 8 及更高版本、tvOS 9 及更高版本以及 watchOS 2 及更高版本的设备上调试。Xcode 11.5 需要运行 macOS Catalina 10.15.2 或更高版本的 Mac。
已解决的问题
修复了针对 armv7 设备时代码生成不正确的问题。(61901594)
Apple LLVM version 10.0.0 (clang-1000.11.45.2)
已在 Mac App Store 中提供,包括适用于 iOS 12、watchOS 5、macOS 10.14 和 tvOS 12 的 SDK。Xcode 10 支持 iOS 8 及更高版本、tvOS 9 及更高版本以及 watchOS 2 及更高版本的设备上调试。Xcode 10 需要运行 macOS 10.13.6 或更高版本的 Mac。
新功能
Xcode 10 增加了对 C++17 头文件
、
和
. (39271859)
已解决的问题
Clang 现在可以正确处理可能影响代码完成支持的无效 Objective-C 属性。(33761186)
弃用
使用 libstdc++ 构建已在 Xcode 8 中弃用,并且在针对 iOS 时在 Xcode 10 中不受支持。C++ 项目现在必须迁移到 libc++,并且建议将部署目标设置为 macOS 10.9 或更高版本,或者 iOS 7 或更高版本。除了更改 C++ 标准库构建设置外,开发人员还应审核硬编码的链接器标志和目标依赖项以删除对 libstdc++ 的引用(包括 -lstdc++、-lstdc++.6.0.9、libstdc++.6.0.9.tbd 和 libstdc++.6.0。 9.dylib)。项目依赖项(例如针对 libstdc++ 构建的静态档案)也需要针对 libc++ 重新构建。(40885260)
Libgcc 已过时。Xcode 10 无法再构建部署目标为 macOS 10.4 和 10.5 的应用程序。(42818150, 38035243)
Apple LLVM version 10.0.1 (clang-1001.0.46.3)
包括适用于 iOS 12.2、watchOS 5.2、macOS 10.14.4 和 tvOS 12.2 的 SDK。Xcode 10.2 支持 iOS 8 及更高版本、tvOS 9 及更高版本以及 watchOS 2 及更高版本的设备上调试。Xcode 10.2 需要运行 macOS 10.14.3 或更高版本的 Mac。
新功能
-Watomic-implicit-seq-cst
是一个新警告,默认关闭,当 C_Atomic
或与隐式、顺序一致的排序一起使用时发出警告。大多数代码库默认使用顺序一致性,但有些要求开发人员在任何地方都使用显式排序。此警告适用于后一组。(28172966)__sync_*
新的诊断识别使用引号包含而不是框架样式包含的框架标头。默认情况下警告是关闭的,但您可以通过传递-Wquoted-include-in-framework-header
来启用它clang
。(37077034)
-Wmemset-transposed-args
是一个新警告,用于诊断memset
对第二个和第三个参数转置的调用。例如,以下调用被诊断为带有新警告:memset(buf, sizeof(buf), 0)
. (42360478)
的构造函数现在根据其成员的相应构造函数是否为. 这是一个符合标准的扩展,它具有潜在的性能优势,以防对于不会在构造时抛出异常的类型进行更快的操作。(29537079)std::pair
noexcept
noexcept
在 a或 a中使用非常量可调用谓词的警告现在显示了错误容器的实例化点,而不是不相关的实现细节。(41370747)std::map
std::set
和标
头已被弃用,取而代之的是它们的 C++17 对应标头:
和
. 它们将在 Xcode 的未来版本中删除,您不应依赖它们的存在。(46903112)
已删除使用内联宏来控制 libc++ 标头中符号的可见性,以提供更好的解决方案。这应该会导致包含 libc++ 标头的代码的代码大小和性能得到改进,并在使用 libc++ 时显着改进调试体验。(47259325)
框架中的公共标头可能会错误地#import
或#include
私有标头,这会导致分层违规和潜在的模块循环。有一个报告此类违规行为的新诊断程序。OFF
默认情况下,它clang
由-Wframework-include-private-from-public
标志控制。(38712182)
在框架中使用@import
标头可防止在没有模块的情况下使用标头。当您传递标志时,新的诊断会检测@import
框架头文件的使用。-fmodules
诊断OFF
默认情况下clang
使用-Watimport-in-framework-header
标志进行控制。(39192894)
以前,在为框架声明模块时省略framework
关键字不会影响编译,但会默默地做错事。一个新的诊断,-Wincomplete-framework-module-declaration
和一个新的修复——它建议添加适当的关键字。当您将-fmodules
标志传递给clang
. (39193062)
已解决的问题
静态分析器现在会在 C++ 对象在其内容被移动后被使用时发出警告,除非该对象在使用前被重置为已知状态。(41349073)
静态分析器现在检查是否违反了 IOKit 和 libkern 引用计数规则。这些违规行为可能导致泄漏和释放后使用问题。(46359592)
Clang 14.0.0 Release Notes — Clang 14.0.0 documentation
“libc++” C++ Standard Library — libc++ 15.0.0git documentation
Libc++ aims to support common compilers that implement the C++11 Standard. In order to strike a good balance between stability for users and maintenance cost, testing coverage and development velocity, libc++ drops support for older compilers as newer ones are released.
Compiler | Versions | Restrictions | Support policy |
---|---|---|---|
Clang | 13, 14 | latest two stable releases per LLVM’s release page | |
AppleClang | 13 | latest stable release per Xcode’s release page | |
Open XL | 17.1 (AIX) | latest stable release per Open XL’s documentation page | |
GCC | 11 | In C++11 or later only | latest stable release per GCC’s release page |
Libc++ also supports common platforms and architectures:
Target platform | Target architecture | Notes |
---|---|---|
macOS 10.9+ | i386, x86_64, arm64 | Building the shared library itself requires targetting macOS 10.11+ |
FreeBSD 10+ | i386, x86_64, arm | |
Linux | i386, x86_64, arm, arm64 | |
Windows | i386, x86_64 | Both MSVC and MinGW style environments |
AIX | powerpc, powerpc64 |
Clang Compiler User's Manual
Clang - Getting Started