C语言的神奇用法

使用void解除warning

在很多地方可以看到这些定义,将入参改变类型为void,其主要作用是将没用到的入参使用一下,不然编译器会报warning。

宏定义或枚举转换成字符串

#符号用于预处理指令,它可以将宏参数转换为字符串字面值。TRANS_TO_STR(STR) 是一个宏定义,它将宏或者枚举STR转换为字符串字面值。这种转换可以方便地将枚举值转换为相应的字符串表示,用于日志输出、错误处理等场景。

#define TRANS_TO_STR(STR) #STR

ASSERT断言

 作用:是用于对程序进行调试的,对于执行结构的判断,而不是对于业务流程的判断。(相当于一个if ()语句,如果满足断言的执行程序,如果不满足则抛错误)

assert 的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先打印一条出错信息,然后通过调用 abort 来终止程序运行。

(注:使用 assert 的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。)

程序当中断言有几种,DEV_ASSERT,DEM_ASSERT,configASSERT。

DEV_ASSERT

里面是一个判断表达式,如果表达式成立,则什么都不做。如果表达式不成立,执行BKPT_ASM进入调试中断,并且死循环。

BKPT_ASM就是进入调试中断

DEM_ASSERT

该断言用于诊断。表达式成立则什么都不做,不成立也什么都不做。

configASSERT

如果表达式不成立,调用taskDISABLE_INTERRUPTS()函数失能所有中断并进入死循环。

指针传入封闭函数

情景:

使用一个封闭的接口函数进行开发。

Rte_Call_RL_Door_Status_Read(DigitalLevel * Level)

由于该函数被封,按照原理传入指针Level。

一开始的时候只是定义了指针DigitalLevel * Level;

传入函数Rte_Call_RL_Door_Status_Read(Level);

这样的做法是不对的,这样跟定义变量传入指针不同。

DigitalLevel  Level;//定义变量的时候程序会自动分配RAM空间给到变量Level
Rte_Call_RL_Door_Status_Read(&Level);//在里面做的改变本质上改变的是RAM空间

需要让它指向RAM的区域,否则程序会在Rte_Call_RL_Door_Status_Read接口函数当中修改掉0地址的内容。

DigitalLevel * Level;//当指针初始化的时候,默认指向NULL,就是0地址的地方。
Rte_Call_RL_Door_Status_Read(&Level);//在里面做的改变本质上改变的是0地址的内容

关键字_at_的使用

查看一些老旧代码的时候看到有这么一段。

这个函数是轮询执行的,但是sourceinsight却没有找到vs_ucLedSegDutyRam的定义,全局搜索才找得到,结果发现原来它的定义很奇特。

里面用了_at_这个东西

_at_是让定义的vs_ucLedSegDutyRam首地址定义在0x530这个内存位置,实际上,这个位置是控制LED的几个IO口寄存器,配置这里就是配置LED的亮灭。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃鱼的羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值