C99标准现在还有些编译器支持的不太好,但是用gcc已经完全没问题了。
C99重要的更新如下:
指定初始化(Designated Initializers)
允许对数组元素或结构体元素的特定成员进行初始化而不用按顺序进行初始化。 主要是结构体成员的指定,和数组成员的指定。
结构体成员,比如,
struct S {
int a;
int b;
};
struct S instance1={
.a=1,
};
struct S array1[5]={
[1].a = 3,
[1].b = 5,
{
// array1[2] = {7, 11}
.a = 7, .b = 11
}
// array1[4] = {13, 17}
[4] = {
.a = 13, .b = 17
}
};
变长数组(Variable Length Arrays)
C99支持动态长度的数组(VLA),也就是数组在栈上由运行时分配。退出作用域时,数组使用的空间被释放。所以VLA不能在全局定义,或者有extern,static修饰符。
int n; //define a variable n
int array[n]; //define an array with length n
伸缩型数组成员(Flexible Array Members)
C99支持伸缩数组成员,最后一个结构体成员的大小可以在运行时分配。
struct flex_array
{
int a;
double b;
char c[];
};
struct flex_array *fa_sample = (struct flex_array*)malloc(sizeof(flex_array)+100*sizeof(char));
fa_sample->c[2] = 's';
bool类型
用<stdbool.h>来使用bool类型,而使用true或者false来为变量赋值或比较。
long long类型
新的long long类型为了统一不同编译器实现对64位的支持,在format时使用%lld来输出long long。
inline函数
尽量使用inline函数来替代所谓的“函数宏”。
混合声明(mix declarations and code)
现在可以在代码里随处定义变量了。但是要注意作用域。
// 行注释
不解释,编译器早就支持了。
for循环变量初始化(for loop intializers)
在for语句里可以定义局部变量了,早就该有的特性。
变参宏(Variadic Macros)
gcc的编译器很早之前就支持这个特性了,微软的编译器之前是不可以这个用的。最新的版本不确定。
#define debug(fmt, ...) \
printf("[DEBUG] %s:%d <%s>: " fmt, \
__FILE__, __LINE__, __func__, ##__VA_ARGS__)
复合常量(Compound Literals)
复数(Complex Numbers)
用<complex.h>来使用complex类型
restrict指针
reference
https://blog.csdn.net/syrchina/article/details/6662243
C11 新特性
C11的主要新特性是增加了<thread.h>,还有thread_local修饰符表示变量只在本线程可用。另外相比<pthread.h>,调用格式完全类似,只是函数名前缀缩短了一下,现在是thrd_,mtx_, cnd_和tss_作为前缀。
网友评论