0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

assert与const的使用技巧

汽车电子技术 来源:微亮笔记 作者:PASSION 2023-02-21 15:37 次阅读

我们在编写一段代码时,往往会有许多不可避免的bug出现。这时如何快速地找出并修改这些bug就变得至关重要,本期我们将介绍一些在调试中使我们的代码变得更健全与完善的一些小技巧。

本期主要介绍assert与const的使用技巧

  • assert的使用技巧
    断言(assertion)是一种在程序中的一阶逻辑(如:一个结果为真或假的逻辑判断式),目的为了表示与验证软件开发者预期的结果--当程序执行到断言的位置时,对应的断言应该为真。若断言不为真时,程序会中止执行,并给出错误信息
    断言是一种编程中常用的手段。在通常情况下,断言就是将一个返回值总是需要为真的判别式放在语句中,用于排除在设计的逻辑上不应该产生的情况。比如一个函数总需要输入在一定的范围内的参数,那么程序员就可以对该参数使用断言,以迫使在该参数发生异常的时候程序退出,从而避免程序陷入逻辑的混乱。
    从一些意义上讲,断言并不是正常程序所必需的,不过对于程序调试来说,通常断言能够帮助程序开发者快速定位那些违反了某些前提条件的程序错误。

下面我来举几个具体的使用场景:

<模拟实现库函数strcpy>

#include
void my_strcpy(char* dest,char* src)
{
    while(*src != '\\0')
    {
       *dest = *src;
       src++;
       dest++;
    }
    *dest=*src;
}
int main()
{
    //strcpy-->字符串拷贝
    char arr1[]="################";
    char arr2[]="bit";
    my_strcpy(arr2,arr1);
    printf("%s\\n",arr1);
    return 0;
}

如此,我们就成功地完成了任务,但我们如果用到今天提到的“assert”,则会使我们的代码更加健全,不容易在发生错误的情况下使程序崩溃。

下面来看改进版:

void my_strcpy(char* dest,char* src)
{
    assert(dest != NULL);//断言
    assert(src != NULL);//断言
    
     while(*src != '\\0')
    {
       *dest = *src;
       src++;
       dest++;
    }
    *dest=*src;
}

以上改进版的函数的优势就在于当我们出现传参错误(例如将空指针NULL传入函数)时,系统就会自动报错而不是运行错误甚至崩溃。

当然,上述代码还有很多值得改动和优化的地方,我们后续会集中介绍。

  • const的使用技巧

const是一个修饰符,它可以一个变量转换为常量,且无法修改。

下面我们用相同的例子来解释const的使用方法

#include
void my_strcpy(char* dest,char* src)
{
    while(*src != '\\0')
    {
       *dest = *src;
       src++;
       dest++;
    }
    *dest=*src;
}

这是我们刚才所写的函数,但在我们函数的具体使用过程中如果将源头数组与目标数组弄混,程序运行就会错误且不易被察觉。这时我们如果使用const 修饰一下源头数组,再出现以上错误系统就会自动报错,从而使错误被发现。使用如下:

#include
void my_strcpy(char* dest,const char* src)//注意此处const
{
    while(*src != '\\0')
    {
       *dest = *src;
       src++;
       dest++;
    }
    *dest=*src;
}

这样,当我们传参错误导致源头数组被更改时,系统就会自动提示我们代码出现问题了。

值得一提的是虽然用const 修饰的变量理论上无法被更改,但实际上我们仍可以通过对该变量的地址解引用来实现对此变量的更改:

int main ()
{
    const int num=10;//虽然无法直接改变num的值

    int* p=&num;
    *p=20//但可以通过此方式来更改
}

实际上此操作并不合法,如果我们不想让num通过地址被改变,我们也可以用const来修饰 “int* p” ,从而使*p(也就是num)无

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 逻辑
    +关注

    关注

    2

    文章

    818

    浏览量

    29293
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79541
  • 断言
    +关注

    关注

    0

    文章

    8

    浏览量

    6656
收藏 人收藏

    评论

    相关推荐

    C语言const关键字的用法

    const是constant的简写,用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变。
    发表于 06-29 09:51 346次阅读

    C语言中assert的使用

    assert意思是断言,常用在程序的DEBUG版本中。
    发表于 07-21 14:51 512次阅读

    C语言assert(断言)简介

    assert的功能,条件为真,程序继续执行;如果断言为假(false),则程序终止。
    的头像 发表于 11-17 16:33 638次阅读
    C语言<b class='flag-5'>assert</b>(断言)简介

    RAW ASSERT

    assert 单独放一篇文章,可见是多么的重要。Raw os 提供了RAW_ASSERT 的接口。强烈建议在产品研发阶段打开assert 功能/*enable assert for
    发表于 02-27 14:09

    如何使用assert

    在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert()的用法像是一种“契约式编程”,在我的理解中,其表达的意思就是,程序在我的假设条件下,能够正常良好的运作,其实就相当于一个
    发表于 04-05 11:05

    如何避免Xil_Assert系列宏导致的死循环

    。  void Xil_Assertconst char8 *File, s32 Line)  {  /* if the callback has been set then invoke
    发表于 01-08 16:29

    怎样去解决RT-Thread系统中ASSERT失效的问题呢

    (*rt_assert_hook)(const char *ex, const char *func, rt_size_t line);/** * This function will set a
    发表于 04-12 17:54

    MFC中ASSERT常见用法

      在C++的消息公告板上经常可以看到出现ASSERT错误的求助信息。虽然这通常是希望消除ASSERT错误的帮助请求,但是几乎所有的求助者都认为ASSERT本身是罪恶的。我完全能理解一
    发表于 09-07 15:55 19次下载

    ASSERT的定义及调试技巧

    C语言中的ASSERT(断言)宏是嵌入式软件开发人员可以使用的最好的调试工具之一。
    的头像 发表于 12-17 11:26 4427次阅读

    怎么理解Assert中的断言语句?

    为什么项目中的代码需要有Assert断言语句?
    的头像 发表于 03-03 14:12 2475次阅读

    C++基础语法之volatile、assert()和sizeof()

    中取值) const 可以是 volatile (如只读的状态寄存器) 指针可以是 volatile assert() 断言,是宏,而非函数。assert
    的头像 发表于 09-09 09:48 1125次阅读

    C++中const以及this指针的使用

    const 作用 修饰变量,说明该变量不可以被改变; 修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer); 修饰引用,指向常量
    的头像 发表于 09-23 11:39 1750次阅读

    C语言中const的用法介绍

    C语言标准库中很多函数的参数都被 const 限制了,但我们在以前的编码过程中并没有注意这个问题,经常将非 const 类型的数据传递给 const 类型的形参,这样做从未引发任何副作用,原因就是上面讲到的,将非
    发表于 01-05 10:03 412次阅读

    const关键字应用总结

    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性
    的头像 发表于 05-26 09:06 368次阅读

    const 和指针变量使用

    有时候我们希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定。例如,用一个变量来表示班级的最大人数,或者表示缓冲区的大小。为了满足这一要求,可以使用const关键字对变量加以限定
    的头像 发表于 06-22 10:43 319次阅读