C语言const关键字详解

描述

const我平时没咋用过,最近在一份代码中配置外设寄存器值的数组定义上看到用了这个,因此进行一下简单的入门学习。 在本文最后1点给出const在配置外设初始默认寄存器的用法

  1. const定义的是变量,不是常量。 只是其值在初始化后就不允许再改变,即const变量为只读变量
  2. 注意以下为以讹传讹的错误结论:定义数组时其长度必须是常量,因此不允许使用const变量。

事实是不同的运行环境结论是不一样的:

(1)我试验在arm的cortex m0好的很,在cortex m0平台上(stm32g031单片机)用const变量来定义数组长度一点问题都没有

(2)而在windows平台上面试验,const变量的确不能用来定义数组长度,编译阶段就会报错

另外,虽然结论是错误的,但因为在有的平台上的确这个结论是成立的,因此为了代码统一规范,最好就遵循不要用const变量来定义数组长度的规则

3.定义const变量时,const和具体数据类型位置可以互换,没有区别,但一般是把const放前面:

(1)一般的定义方法

const  int  a = 10;

(2)const和int位置互换,和上面的定义含义是一样的

int  const  a = 10;

4.const 和 define 的区别

(1)const定义的是变量,define定义的是常量

(2)#define在预编译阶段就展开了,不占用内存,机器只会给变量分配内存,而const定义的是变量,是占用内存的

5.定义一个const数组的方法,用来给外设做初始默认寄存器配置,该数据里面元素的数据类型是结构体

#define SOMEDEVICE_REG_CONFIG_NUM_REGS 16


typedef struct
{
  unsigned char address;    /* 8-bit register address */
  unsigned char value;    /* 8-bit register data */
} somedevice_register_t;


somedevice_register_t const somedevice_registers[SOMEDEVICE_REG_CONFIG_NUM_REGS] =
{
  { 0x00, 0x11 },    
  { 0x01, 0x36 },
  { 0x02, 0x75 },
  { 0x03, 0x27 },
  { 0x04, 0x38 },
  { 0x05, 0x1F },    
  { 0x06, 0x25 },
  { 0x07, 0x88 },
  { 0x08, 0x46 },
  { 0x09, 0x29 },
  { 0x0a, 0x03 },
  { 0x0b, 0x01 },
  { 0x0c, 0x40 },
  { 0x0d, 0x11 },     
  { 0x0e, 0x31 },
  { 0x0f, 0x45 },
};
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分