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

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

3天内不再提示

详解C语言中特殊用法

strongerHuang 来源:嵌入式专栏 作者: strongerHuang 2022-07-15 08:57 次阅读

C语言有很多特殊的用法,如果这些特殊用法使用得当,会是你的代码变得更加有健壮,更加容易维护。

比如我们在使用STM32库的断言(assert),你会发现官方提供了包含“__FILE__、__LINE__”的代码。

标准外设库位于stm32fxxx_conf.h文件:

#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))

HAL使能Assert:

416d4f0a-03d8-11ed-ba43-dac502259ad0.png

在代码中会看见如下代码:

417e1588-03d8-11ed-ba43-dac502259ad0.png

如果添加了这段断言代码,对于开发大型、复杂的系统,这条语句其实用处很大。每次程序运行错误之后,它会打印程序代码指定的位置,方便我们在庞大的程序中很快找到错误的位置。

我们的系统会随着时间的推移,不断升级更新,也就是需要提交很多版本的可执行文件(hex、bin等)。但是,产品后期使用中,我们对某些设备进行了升级,可能忽略了一些设备(忘记升级),如果出现故障,我们怎样才能很快找到是哪一个版本的软件出现故障呢?

我们的系统会随着时间的推移,不断升级更新,也就是需要提交很多版本的可执行文件(hex、bin等)。但是,产品后期使用中,我们对某些设备进行了升级,可能忽略了一些设备(忘记升级),如果出现故障,我们怎样才能很快找到是哪一个版本的软件出现故障呢?

C几种特殊标准定义

__FILE__正在编译文件的文件名__LINE__:正在编译文件的行号__DATE__:编译时刻的日期字符串 如“Sep 22 2020”__TIME__:编译时刻的时间字符串 如”1000“__STDC__:判断该文件是不是标准C程序

1.__FILE__编译文件名称

File中文意思即文件,这里的意思主要是指:正在编译文件对应正在编译文件的路径和文件的名称。

Keil版本对应的路径是相对于工程文件而言的路径,IAR版本路径是相对Windows路径。

源代码:

charBuildFile[]=__FILE__;printf("编译文件路径:%s
", BuildFile);

Keil:

编译文件路径:Appmain.c

IAR

编译文件路径:C:UsersstrongerHuangDesktop工程主目录Appmain.c

2.__LINE__编译文件行号上面说的是编译的文件名,是一个字符串,而这里说的是行号,是一个整型变量,这是这两者的区别, 比如在工程中添加源代码:
char BuildLine = __LINE__;printf("编译代码所在行:%d
", BuildLine);
可以看不是数组的字符串,打印信息编译代码所在行:44 一般情况下,__FILE__是和__LINE__结合一起使用,用于打印我们代码信息,方便快速定位代码位置。 3.__DATE__编译日期__DATE__日期,需要注意的是:这个日期是你在编译时Windows系统的日期,如果对应那部分代码之前编译好了,后面没有编译,这个日期还是之前的日期,而不是后面编译的日期。因此,如果这里用于定版本,就需要在定版本时对工程进行全部重新编译,它才会更新至你最后编译的日期。 代码:
char BuildDate[] = __DATE__;printf("编译日期:%s
", BuildDate);
输出结果:编译日期:Sep 22 2017 4.__TIME__编译时间这个和__DATE__一样的原理,编译时的时间,也是一个字符串。再次提醒:用于定版本:需要重新编译,这样才是最后一次编译时间。 代码:
char BuildTime[] = __TIME__;printf("编译时间:%s
", BuildTime);
输出结果编译时间:1000 5.__STDC__标准C代码这个标准在我们单片机嵌入式编程中运用的比较少,当要求程序严格遵循ANSIC标准时该标识符被赋值为1,主要是判断我们的程序文件是不是标准C程序。 代码:
#ifdef __STDC__  printf("标准C代码文件
");#else  printf("非标准C代码文件
");#endif
审核编辑:汤梓红

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

    关注

    2270

    文章

    10895

    浏览量

    355734
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136692
  • 代码
    +关注

    关注

    30

    文章

    4779

    浏览量

    68521

原文标题:C语言几种特殊标准定义和用法

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言中预定义宏的用法和使用场景

    C语言中,预定义宏是由编译器提供的一组特殊标识符,可以在程序中直接使用,无需进行额外的定义。
    发表于 08-16 16:12 469次阅读

    C语言中指针的基本概念和用法

    C语言中,指针是一项重要的概念,它允许我们直接访问和操作内存地址。
    发表于 08-17 15:30 756次阅读

    C语言中枚举的基本概念和常见用法

    C语言中,枚举是一种方便组织和表示一组相关常量的工具。枚举类型有助于提高代码的可读性和可维护性。本文将介绍C语言枚举的基本概念、语法和用法
    发表于 08-17 15:32 1448次阅读

    C语言中for循环的用法和应用 C语言中for循环与while循环的区别

    C语言中的循环结构时,for循环是最常用的一种。它允许重复执行一段代码,直到满足特定条件为止。
    发表于 08-18 16:33 3228次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>for循环的<b class='flag-5'>用法</b>和应用 <b class='flag-5'>C</b><b class='flag-5'>语言中</b>for循环与while循环的区别

    C语言中while和do-while循环的用法

    循环是一种重要的控制结构,可以使程序重复执行一段代码,直到满足特定条件为止。在C语言中,while和do-while是两种常用的循环结构,本文将详细介绍这两种循环的用法
    发表于 08-18 16:35 1831次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>while和do-while循环的<b class='flag-5'>用法</b>

    SQLx在Rust语言中的基础用法和进阶用法

    SQLx是一个Rust语言的异步SQL执行库,它支持多种数据库,包括MySQL、PostgreSQL、SQLite等。本教程将以MySQL数据库为例,介绍SQLx在Rust语言中的基础用法和进阶
    的头像 发表于 09-19 14:32 5279次阅读

    单片机的C语言中位操作用法

    单片机的C语言中位操作用法
    发表于 08-17 15:04

    C语言中atoi()函数的用法 相关资料分享

    C语言中atoi()函数的用法
    发表于 07-01 08:12

    C语言中的数据类型有哪几种?const有哪些用法

    C语言中的数据类型有哪几种?const有哪些用法?作用域与static用法是什么?extern是如何去使用的?
    发表于 07-22 06:51

    c语言中typedef的用法

    C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环
    发表于 11-09 15:23 9232次阅读

    python语言中类的特殊方法相关用法详细资料概述

    本文和大家分享的主要是python语言中类的特殊方法相关用法,希望对大家有帮助。包括了:构造序列,程序演示
    发表于 10-25 18:01 16次下载

    如何得当使用C语言特殊用法

    C语言有很多特殊用法,如果这些特殊用法使用得当,会是你的代码变得更加有健壮,更加容易维护。 比
    的头像 发表于 09-27 10:41 1936次阅读
    如何得当使用<b class='flag-5'>C</b><b class='flag-5'>语言</b>的<b class='flag-5'>特殊</b>的<b class='flag-5'>用法</b>

    C语言中的#和##的用法

    和conStr的参数,并且宏conStr和toString中均含有#或者##符号,所以A不能被解引用。导致不符合预期的情况出现。 3.2 解决方案 结果: 责任编辑:xj 原文标题:C语言中#和##的用法 文章出处:【微信公众号
    的头像 发表于 12-06 09:34 7.6w次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>的#和##的<b class='flag-5'>用法</b>

    C语言中的typedef的用法

    在以前的学习中对于C语言中typedef和define的认识是,#define是宏,作用是简单的替换,而typedef也是替换,只不过比define高级的是在替换的时候会进行语法检查。但是后来
    发表于 01-13 13:36 0次下载
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>的typedef的<b class='flag-5'>用法</b>

    C语言中__attribute__ 关键字的用法

    嵌入式开发,离不开 C 语言C语言中有很多语法会直接或间接影响你代码的质量,下面就来讲讲__attribute__ 关键字的用法。 1.
    发表于 10-19 09:06 1.2w次阅读