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

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

3天内不再提示

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

strongerHuang 来源:strongerHuang 作者:strongerHuang 2020-09-27 10:41 次阅读

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

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

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

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

HAL使能Assert:

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

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

我们的系统会随着时间的推移,不断升级更新,也就是需要提交很多版本的可执行文件(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推荐阅读:

责任编辑:xj

原文标题:__FILE__、__LINE__等几种C标准用法

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

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

    关注

    180

    文章

    7528

    浏览量

    128428
  • File
    +关注

    关注

    0

    文章

    19

    浏览量

    14179
  • Line
    +关注

    关注

    0

    文章

    25

    浏览量

    11515

原文标题:__FILE__、__LINE__等几种C标准用法

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

收藏 人收藏

    评论

    相关推荐

    C语言-#和##的具体用法

    C语言中,在宏里面使用’#’和’##’有它非常神奇的作用。在宏定义的替换的过程中,#号可以作为一个预处理运算符,把宏参数转换为字符串。##运算符则可以把两个宏参数组合在一起。下面就来说说具体的用法
    的头像 发表于 12-19 12:54 826次阅读
    C<b class='flag-5'>语言</b>-#和##的具体<b class='flag-5'>用法</b>

    C51中断函数和汇编语言中断服务程序在用法上有什么不同?

    C51中断函数和汇编语言中断服务程序在用法上有何不同?
    发表于 10-17 08:31

    Rust的 match 语句用法

    Rust 是一门现代化的系统编程语言,它拥有高性能、内存安全和并发性等特点。Rust 的语法设计非常优秀,其中 match 语句是一种非常强大的语言特性。match 语句可以让我们根据不同的匹配模式
    的头像 发表于 09-19 17:08 651次阅读

    基于Rust语言Hash特征的基础用法和进阶用法

    ,包括Hash trait、HashMap、HashSet等,本教程将详细介绍Rust语言Hash特征的基础用法和进阶用法。 基础用法 使用Hash trait 在Rust
    的头像 发表于 09-19 16:02 731次阅读

    Stream模块的基础用法和进阶用法

    在 Rust 语言中,Tokio 是一个非常流行的异步编程框架。它提供了一系列的模块,其中最常用的就是 Stream 模块。Stream 模块允许我们以异步的方式处理数据流,这在很多情况下非常
    的头像 发表于 09-19 15:33 705次阅读

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

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

    C语言中位运算符的高级用法(6)

    在上一篇文章中,我们介绍了~运算符的高级用法,本篇文章,我们将介绍
    发表于 08-22 10:51 165次阅读
    C<b class='flag-5'>语言</b>中位运算符的高级<b class='flag-5'>用法</b>(6)

    C语言中位运算符的高级用法(5)

    在上一篇文章中,我们介绍了~运算符的高级用法,本篇文章,我们将介绍
    发表于 08-22 10:49 174次阅读
    C<b class='flag-5'>语言</b>中位运算符的高级<b class='flag-5'>用法</b>(5)

    C语言中位运算符的高级用法(4)

    在上一篇文章中,我们介绍了^运算符的高级用法,本篇文章,我们将介绍~ 运算符的一些高级用法
    发表于 08-22 10:48 140次阅读
    C<b class='flag-5'>语言</b>中位运算符的高级<b class='flag-5'>用法</b>(4)

    C语言中位运算符的高级用法(3)

    在上一篇文章中,我们介绍了|运算符的高级用法,本篇文章,我们将介绍^ 运算符的一些高级用法
    发表于 08-22 10:47 150次阅读
    C<b class='flag-5'>语言</b>中位运算符的高级<b class='flag-5'>用法</b>(3)

    C语言中位运算符的高级用法(2)

    在上一篇文章中,我们介绍了&运算符的高级用法,本篇文章,我们将介绍| 运算符的一些高级用法
    发表于 08-22 10:45 182次阅读
    C<b class='flag-5'>语言</b>中位运算符的高级<b class='flag-5'>用法</b>(2)

    C语言中位运算符的高级用法(1)

    在上一篇文章中,我们介绍了&运算符的基础用法,本篇文章,我们将介绍& 运算符的一些高级用法
    发表于 08-22 10:44 177次阅读
    C<b class='flag-5'>语言</b>中位运算符的高级<b class='flag-5'>用法</b>(1)

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

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

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

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

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

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