C99的一些新特性记录

固长类型头文件

由于历史原因,C语言中实现的整型数只保证了在不同硬件体系中的最小长度,因此在使用时,需要根据代码实际运行的平台来确定类型的长度,这导致代码非常不方便移植。C99标准通过增加固长类型头文件引入了固定长度的整型数。stdint.h文件定义的固长整数类型如下:

8位整型数:int8_t,uint8_t
16位整型数:int16_t,uint16_t
32位整型数:int32_t,uint32_t
64位整型数:int64_t,uint64_t

注意,在单片机的stm32f4xx.h文件中又进一步做了定义u8、u16、u32

C99的一些新特性记录_第1张图片

unsigned int 32 (C语言标准表达方法)

这三种方式都是在表达同一个意思。ST 搞这么多花样,无非是想开发人员在写代码时定义数据类型能少写几个符号,然后又因为前后版本升级,为了兼容旧版本(主要是V2.0)才会出现这么多表示方法。不管他怎么换,都是基于标准C来的。 

 

bool类型

C标准的一大缺憾就是没有定义布尔类型,导致在大部分软件中都基本需要自定义布尔类型使用。C99标准意识到了这个问题,新增加了_Bool关键字,用于定义布尔类型。至于布尔类型值的定义则置于新增的stdbool.h头文件中:

#ifdef __cplusplus
# define false false
# define true true
#else
# undef false
# define false 0
# undef true
# define true 1
#endif

for循环变量初始化

C99标准引入了C++中的for循环变量初始化方式,允许在for循环语句中定义循环局部变量使用,这避免了每次使用for循环语句时,都需要定义一个通常只会在for语句中使用的循环变量:

混合声明

在ANSI C标准中,局部变量声明必须要放在函数的首部,这是由历史原因造成。编译器在编译函数时,需要提前为函数预留堆栈空间,将局部变量放在首部便于编译器进行处理。但是C99现在支持混合声明,这意味着,你可以在函数实现的任何地方,声明你所需要的变量。

内联函数

C99标准新增inline关键字用于修饰函数,使用inline关键字修饰的函数则成为内联函数,编译器在编译时,会尝试将内联函数扩展到所有该函数的调用处,从而避免过多的对该函数调用的开销。但由于内联函数的代码指令会被扩展到被调用处,因此会增加目标文件的大小,所以需要谨慎使用内联语义。


处于宏定义和函数之间的一种方案。

内联函数和宏的区别在于,宏是由预处理器对宏进行替代 ,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。

内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。编译时,类似宏替换,使用函数体替换调用处的函数名。

内联函数也有一定的局限性。就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。这样,内联函数就和普通函数执行效率一样了。

更多内容可参考百度百科内联函数_百度百科

你可能感兴趣的:(单片机)