C-关键字

__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){    UNUSED(huart);   }

   用__weak修饰词函数就表示这个函数可以被覆盖,在这只是用来占位表示函数存在,自己写一个函数不存在重复定义。


__align(4) u8 mem1base[MEM1_MAX_SIZE];

   __align(4)关键字保证malloc分配出来的首地址是4字节对齐。自定义的malloc函数本身没有对分配的内存实现4字节或以上的对齐操作,分配出不对齐的内存编译器也不知道,很可能会产生问题。 __align只修饰最高级类型对象不能用于结构或者函数对象(mdk的标准malloc申请的内存区时8字节对齐的)


__packed int* p;

  __packed struct STRUCT_TEST{}

  使用__packed关键字是进行一字节对齐,保证对对象的读写访问都进行非对齐访问,没有__packed的将以默认的方式对齐,不足对齐字节以对其的字节补齐,扩展了数据大小。float及包含float的结构及未用__packed的对象将不能字节对齐,__packed int 也是没有意义的。


const

   int *const a; //const修饰*,表示一个指向整数的常指针,a指向的整数可以修改,但指针a不能修改。
   const int *a; //const修饰的是(*a),这句表示指针指向一个常整数。

   关键字const要求其所修饰的对象为常量,不可对其修改和二次赋值操作。保护被修饰的东西,防止意外的修改,使用const修饰的常量具有不可变性。

   const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,#define定义的常量在内存中有若干个拷贝,const定义的常量在程序运行过程中只有一份拷贝,所以可以避免不要的内存分配。合理的使用const关键字,不仅能够让编译器很好的保护相应的数据,还能够直观的向代码的阅读者传递有用信息。


volatile

   内存访问速度远不及CPU处理速度,为提高机器整体性能,硬件上引入硬件高速缓存Cache,加速对内存的访问,所以编译器一般都会作减少存取外部RAM的优化。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量合并,常量传播等优化,进一步可以死代码消除。但有时这些优化不是程序所需要的,这时可以用volatile关键字禁止做这些优化;保证编译后的程序每次在使用该变量时都会从变量的地址中读取,而不是从寄存器中获取。

   需要注意的是,没有用volatile也可能能正常运行,但是可能在修改了编译器的优化级别后就又不能正常运行。一般说来,中断服务程序中修改的供其它程序检测的变量需要加volatile;多任务环境下各任务间共享的标志应该加volatile;存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义。

  由于C 编译器是没有线程概念这时就需要用到volatile了。该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被多个线程修改,而程序通过该变量可以同步各个线程。


static 

   如果一局部变量被声明为static,那么将只有唯一的一个静态分配的对象,它被用于在该函数的所有调用中表示这个变量。这个对象将只在执行线程第一次到达它时初始化,且只能初始化一次。如果在定义的时候不初始化,编译器就会自动赋值为0(如果重复调用同一个函数,在第二次调用时不会再执行变量初始化)
   修饰函数体外的变量和函数,static是对它修饰的对象进行了作用域限定,static修饰的函数以及函数外的变量,都是只能在当前的代码文件中被访问,其它的文件不能直接访问。不是为了限制其存储方式,而主要是为了限制该全局变量或者函数的作用域仅限于本文件,所以又称为内部函数。
   static变量的”记忆性”破坏了程序运行很重要的可重复性, 不同时刻运行的结果可能不同。
   普通的local变量的存储空间分配在stack上, 每次调用函数时分配的空间都可能不一样, 而static具有全局唯一性的特点, 每次调用都指向同一块内存, 这就造成了不可重入。



   



 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值