前一阵在学操作系统,需要使用c语言,所以昨天晚上闲来无事翻看了C11及其之后的标准,它添加了很多新东西,虽然网上已经有很多总结,但是我还是按耐不住自己的心情自己写一个自己认为有用的能记住的。
C99之后总共有三个大版本标准,分别是c11
,c17
和c23
。其中c17并没有什么过大改进所以不详细描述。
C11
移除了gets
,要么使用scanf,要么使用gets_s替代。
高级对齐功能支持
- _Alignof 获取类型对气候的空间大小
- _Alignas 指定以多少字节强制对齐,
两者在c23成功升级为alignof
和alignas
关键字,
多线程支持
原子对象,多线程,原子操作,Thread local storage
。
Unicode支持
_Generic 一点点的泛型 和”函数重载”支持
编译期实现。对不同type的表达式,选择不同函数进行调用。
1 |
|
_Noreturn 无返回值标记
标记一个函数不会通过return关键字返回。 大概是用于longjmp的吧?我没用过不太清楚。
匿名struct和union
_Static_assert 静态断言,要求在编译期确定表达式。与assert另一个不同是标准支持发生static_assert时可以填入message
在c23中成为static_assert关键字(也有可能是宏实现)
还有新增的library features,直接贴算了
New headers
- <stdalign.h>
- <stdatomic.h>
- <stdnoreturn.h>
- <threads.h>
- <uchar.h>
Library features
- Concurrency support library
- aligned_alloc()
- UTF-16/32 type aliases
- char16_t
- char32_t
- UTF-16/32 conversion functions
- mbrtoc16()
- mbrtoc32()
- c16rtomb()
- c32rtomb()
- quick_exit
- at_quick_exit
- Exclusive modes of fopen() and freopen() (“x”)
- Bounds checking functions
- timespec
- timespec_get()
- CMPLX(F|L)?
- New numeric limit macros
- (FLT|DBL|LDBL)_DECIMAL_DIG
- (FLT|DBL|LDBL)_TRUE_MIN
- (FLT|DBL|LDBL)_HAS_SUBNORM
- Thread local errno
来源https://en.cppreference.com/w/c/11
总的来说,c11让c语言支持了比较现代的多线程环境,虽然还是有一种原始的气息,比如至今不支持读取目录下的文件,据说是各os和fs对目录实现不同,统一接口比较困难。 但是依旧在变得更加舒适。
C23
来源https://en.cppreference.com/w/c/23
c23是最新一个标准,也是我认为有很多有意思新功能的地方,我挑几个有意思的讲讲。
移除了一堆东西,部分功能性宏转正关键字。
asctime和ctime标记deprecated。
宏INFINITY DEC_INFINITY NAN DEC_NAN从math.h移动到float.h
新语言特性
忽略其他
一个auto
关键字,支持比较简单的类型推导?反正目前我在gcc上用-std=c2x测试了一下不能对函数返回值进行推导。
Attributes
标准化attributes的格式,例如在之前使用gnu拓展的always_inline
写作__attribute__((always_inline)) void foo(const char);
而新版标准允许写成更加简洁的[[gnu::always_inline]]
新增了一些其他的attributes。
可以使用'
作为数字分隔符了
Identical cvr-qualifications for array types and their element type(看不懂干什么)
nullptr预定义的空指针常量,其类型为nullptr_t。应该是用于替换NULL,因为NULL是implementation-defined
不同平台
constexpr常量表达式,但是比c++的弱一些。
新的预处理命令
- #elifdef
- #elifndef
- #warning
- #embed
其中这个embed实现了直接在预处理阶段嵌入文件,有点go的embed的感觉,或许以后c语言静态链接的单文件程序也会火起来?
IEEE 754 decimal floating-point types
Character constant
这块没懂,但是新增了一个utf8编码的u8'你好'
0b二进制字面量
新增对于format二进制的%b %B
总结
c23被下放很多c++的功能,这很好,在保持足够简洁的情况下依旧添加更舒服开发的功能。