|
例如声明一个8位无符号整数,常见的有如下几种写法:
u8 err;
U8 err;
INT8U err;
UINT8 err;
uint8 err;
uint8_t err; 【我们推荐的写法,这种写法符合C99规范,ST最新的固件库都沿用该写法】
你喜欢哪种形式的变量申明类型?
你有没有这种体会,阅览不同人编写的程序,重定义的变量类型五花八门。当你整合部分软件模块时,经常遇到风格各异的变量类型,看着极其不爽。
甚至你自己都无法确定自己写的代码用哪种写法合适?
如果你遇到这种困惑,那么这个帖子可以为你指明一个方向。
其实最基础的标准c语言规定了 int , unsigned int,long 等类型,但是很不幸的是 int 在8位单片机C编译系统是16位的整数,int 在32位单片机C编译器系统是32位。
于是便衍生了 typdef 重定义的变量类型来规避此类风险。
我们来看看ST公司的STM32固件库的变化,STM32F1固件库经历了V1.x, V2.x, V3.x 几次大的升级。从V3.x开始,所有的变量类型由简单的u8、 s16 等更名为 uint_8、int16_t 等较为规范的类型。
更改之后的变量类型名变长了,增加了键入的工作量。你想过为什么ST公司会做出这种改变吗?
因为这种写法遵循了c99规范。开发环境中的头文件stdint.h已经定义了这些标准typedef.
stdint.h是c99 (c语言规范)中引进的一个标准C库的头文件. 目前大部分单片机C编译器均支持,当然IAR和MDK都支持。 linux 系统下的编译器也支持.
这个文件在不同的C编译器的存放路径如下: [可以自己打开stdint.h文件,看一下它定义了哪些类型]
ARM编译器MDK C:\Keil\ARM\RV31\INC
ARM编译器EWAM C:\Program Files\IAR Systems\Embedded Workbench 5.4\arm\inc
STM8编译器EWSTM8 C:\Program Files\IAR Systems\Embedded Workbench 6.0 Evaluation_2\stm8\inc\c
PIC编译环境MPLAB C:\Program Files\Microchip\MPLAB C32 Suite\pic32mx\include
飞思卡尔单片机环境 C:\Program Files\Freescale\CodeWarrior for Microcontrollers V6.2\ColdFire_Support\msl\MSL_C\MSL_Common\Include
PC软件C++ Builder C:\Program Files\Borland\CBuilder6\Include
stdint.h中定义了一些整数类型,规则如下
int8_t, int16_t, int32_t, int64_t 表示各种长度的有符号整型数
uin8_t, uint16_t, uint32_t, uint64_t 表示各种长度的无符号整型数
定义了一些常量表示以上各类型数的最大最小值. (如果你的程序需要检查整数的值域,那么可以直接用这些宏即可,没必要自己再定义了)
INT8_MIN, INT8_MAX
INT16_MIN, INT16_MAX
INT32_MIN, INT32_MAX
INT64_MIN, INT64_MAX
这些宏的定义如下(仅仅举了2个例子,其他的参见 stdint.h
#define INT8_MIN -128
#define INT16_MIN -32768
安富莱开发板配套的STM32例程,从2009年最初的版本开始就一直沿用C99的标准写法来定义整数。
我们做其他的单片机项目也是采用这种写法,比如STM8、PIC,飞思卡尔甚至51单片机。
如果你拿不定选择哪种写法好,那么就请按C99的规范来定义整数。
|
|