C99、C11和C17是C语言的三个连续的国际标准,每个新标准都在前一个标准的基础上引入了新特性和改进。
C99 相对于 C90 的改进:
- 变长数组(VLA):C99 允许在运行时确定数组的长度,这增加了语言的灵活性。
- 内联函数:C99 引入了内联函数的概念,允许编译器将函数体直接嵌入到函数调用处以减少函数调用的开销。
- 新的数据类型:比如
long long
和_Bool
类型,以及对复数的支持。 - 复合字面量:允许在声明的同时初始化数组或结构体。
- 单行注释:C99 允许使用
//
单行注释,使得代码更加简洁。
C11 相对于 C99 的改进:
- 匿名结构体:C11 允许在代码中定义匿名结构体,这使得代码更加简洁。
- 泛型选择表达式:C11 引入了
_Generic
关键字,允许在编译时根据条件选择不同的类型。 - 多线程支持:C11 引入了
_Atomic
类型和线程局部存储等特性,增强了对多线程编程的支持。 - 静态断言:C11 引入了
_Static_assert
关键字,允许在编译时进行断言。 - 边界检查接口:C11 提供了边界检查的接口,增强了程序的安全性。
C17 相对于 C11 的改进:
- 初始化宏:C17 引入了初始化宏,使得宏定义可以包含初始化代码。
- 属性:C17 引入了更多的属性,如
fallthrough
、nodiscard
等,以帮助编译器进行更好的优化和错误检查。 - 线程局部存储:C17 进一步增强了对线程局部存储的支持。
- 复合字面量改进:C17 允许在复合字面量中使用类型转换。
总的来说,C99 标准对 C90 进行了现代化的更新,C11 则在现代计算机编程环境下对 C99 进行了进一步的增强,而 C17 主要是对 C11 标准的修订和更新,旨在进一步改进语言的特性和可用性。每个新标准都使得 C 语言更加强大和灵活,以适应现代编程的需求。
查看Linux系统支持的C标准
要查看当前系统执行的 C 标准是否是 C11,可以使用以下方法
-
使用
gcc
命令查看支持的 C 语言标准: 执行以下命令:gcc -E -dM - </dev/null | grep "STDC_VERSION"
这个命令会显示
__STDC_VERSION__
的定义,从而可以知道默认支持的 C 标准。输出结果和 C 标准的对应关系如下:- 如果是
#define __STDC_VERSION__ 199901L
,则默认支持的是 C99 标准; - 如果是
#define __STDC_VERSION__ 201112L
,则默认支持的是 C11 标准; - 如果是
#define __STDC_VERSION__ 201710L
,则默认支持的是 C17 标准; - 如果没有查到,则默认支持的是 C89 标准。
- 如果是