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

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

3天内不再提示

ANSIC几种特殊的标准定义 (__FILE__、__LINE__、__STDC__···)

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-20 09:46 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Ⅰ写在前面

为方便大家阅读,本文内容已经整理成PDF文件:

http://pan.baidu.com/s/1gfHygyn

对于我们大部分使用单片机进行裸机开发的朋友来说,可能很少有人在程序中许多关键的地方打印一些关键信息。

有较大系统开发,或复杂系统开发经验的朋友一般都会在程序中输出很多调试信息,如在UCOSfreeRTOSLinux等系统开发调试时打印许多关键信息。

1.我们在使用STM32库开发时,在stm32fxxx_conf.h文件下会发现如下这么一条语句:

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

这条语句,对于使用寄存器,开发简单且不大程序的朋友而言,可能他觉得用处不大,它可能就觉得很占资源,且耗时。

其实不然,ST这么设计是有他一定的道理的,对于开发大型、复杂系统的朋友而言,这条语句其实用处很大。每次,程序运行错误之后,它会打印程序代码指定的位置,方便我们在庞大的程序中很快找到错误的位置。

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

这里就需要我们在程序中添加一些关于版本的信息,我们最基础的就是Vx.x.x.x等这种信息,但对于大型系统而言,这种信息是不够的,还需要更多,比如:编译日期,时间,编译环境的版本等。

Ⅱ几种特殊标准定义

上面说了这么多,就是需要让大家知道,这些特殊标准定义的用途。上面说的只是简单的举例,其实他们的用途还很广泛,掌握了基础之后相信你们都会知道它们更多比较实用的意义。言归正传,下面讲述这些基础的知识。

本文主要讲述下面几个标准定义:

__LINE__:正在编译文件的行号

__FILE__:正在编译文件的文件名

__DATE__:编译时刻的日期字符串 如“Jun 17 2017”

__TIME__:编译时刻的时间字符串 如”1000“

__STDC__:判断该文件是不是标准C程序

1.__FILE__编译文件名称

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

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

比如下面提供源代码工程:

char BuildFile[] = __FILE__;

printf("编译文件路径:%s\n", BuildFile);

Keil:

编译文件路径:App\main.c

IAR:

编译文件路径:C:\Users\Administrator\Desktop\STM32F417ZG(IAR)_ANSIC几种特殊的标准定义\App\main.c

2.__LINE__编译文件行号

上面说的是编译的文件名,是一个字符串,而这里说的是行号,是一个整型变量,这是这两者的区别,所以在我提供工程中可以看到的源代码:

char BuildLine = __LINE__;

printf("编译代码所在行:%d\n", BuildLine);

可以看不是数组的字符串,打印信息:

编译代码所在行:44

一般情况下,__FILE__是和__LINE__结合一起使用,用于打印我们代码信息,方便快速定位代码位置。

3.__DATE__编译日期

__DATE__日期,需要注意的是:这个日期是你在编译时Windows系统的日期,如果对应那部分代码之前编译好了,后面没有编译,这个日期还是之前的日期,而不是后面编译的日期。因此,如果这里用于定版本,就需要在定版本时对工程进行全部重新编译,它才会更新至你最后编译的日期。

代码:

char BuildDate[] = __DATE__;

printf("编译日期:%s\n", BuildDate);

输出结果:

编译日期:Jun 17 2017

4.__TIME__编译时间

这个和__DATE__一样的原理,编译时的时间,也是一个字符串。

再次提醒:用于定版本:需要重新编译,这样才是最后一次编译时间。

代码:

char BuildTime[] = __TIME__;

printf("编译时间:%s\n", BuildTime);

输出结果

编译时间:1115

5.__STDC__标准C代码

这个标准在我们单片机及嵌入式编程中运用的比较少,当要求程序严格遵循ANSIC标准时该标识符被赋值为1,主要是判断我们的程序文件是不是标准C程序。

#ifdef __STDC__

printf("标准C代码文件\n");

#else

printf("非标准C代码文件\n");

#endif

Ⅲ源代码分析与下载

为了方便大家学习,本文提供的源代码比较基础和简单,也方便理论结合实际学习,仅供参考。

我们在之前新建好的Demo工程上添加了如下部分代码:

char BuildLine = __LINE__;

char BuildFile[] = __FILE__;

char BuildDate[] = __DATE__;

char BuildTime[] = __TIME__;

printf("编译文件路径:%s\n", BuildFile);

printf("编译代码所在行:%d\n", BuildLine);

printf("编译日期:%s\n", BuildDate);

printf("编译时间:%s\n", BuildTime);

#ifdef __STDC__

printf("标准C代码文件\n");

#else

printf("非标准C代码文件\n");

#endif

Keil版本输出结果:

编译文件路径:App\main.c

编译代码所在行:44

编译日期:Jun 17 2017

编译时间:1115

标准C代码文件

IAR版本输出结果:

编译文件路径:C:\Users\Administrator\Desktop\STM32F417ZG(IAR)_ANSIC几种特殊的标准定义\App\main.c

编译代码所在行:44

编译日期:Jun 17 2017

编译时间:1100

标准C代码文件

源代码工程(STM32F417ZG_ANSIC几种特殊的标准定义)下载地址:

http://pan.baidu.com/s/1hskScba

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

    关注

    6074

    文章

    45341

    浏览量

    663706
  • 寄存器
    +关注

    关注

    31

    文章

    5590

    浏览量

    129091
  • ANSIC
    +关注

    关注

    0

    文章

    6

    浏览量

    8882
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    单片机串口调试的巧妙方法分享

    printf(\"%s %srn\" ,__DATE__ ,__TIME__ );//日期时间 printf(\"%s %s%dn\",__FILE__
    发表于 11-21 06:28

    无线充qi2新标准:无线革命新篇章

    Qi2标准带来无线充电革命,实现精准定位、高速充电、多设备兼容与环保减废。
    的头像 发表于 11-15 08:14 2850次阅读
    无线充qi2新<b class='flag-5'>标准</b>:无线革命新篇章

    GD32F527添加以太网后程序仿真器烧录启动成功,手动上电卡死是怎么回事?

    %d\\n\", __FILE__, __FUNCTION__, __LINE__); rt_kprintf(\"object:%p type:0x%x\\n\"
    发表于 11-05 13:16

    rtt studio用DAP下载不成功怎么解决?

    ;pyocdprobecmsis_dap_probe.py\", line 249, in read_dp File \"
    发表于 10-10 07:01

    探索PIC32CM JH-Value Line Curiosity Nano+触摸评估套件:功能与上手指南

    (MCU)。此评估套件可轻松访问微控制器的功能,可用于开发自定义应用程序。Microchip Technology PIC32CM JH-Value Line 套件预装了独立的演示应用程序,并通过USB Type-C^®^ 连接供电。该套件可作为独立的发现元素使用,也可与
    的头像 发表于 09-28 10:59 501次阅读
    探索PIC32CM JH-Value <b class='flag-5'>Line</b> Curiosity Nano+触摸评估套件:功能与上手指南

    GRAYSCALE+SVGA+find_line_segments报堆栈错误如何处理?

    ): File "", line 36, in MemoryError: Out of fast frame buffer stack memory MPY: soft
    发表于 07-29 09:27

    华为联合业界伙伴主导的SRv6压缩标准RFC 9800正式发布

    部署加速阶段。 RFC9800是SRv6核心系列标准里面定义SRv6压缩方法的关键标准,该标准定义了REPLACE(即华为主导联合业界伙伴原创提出的G-SRv6技术)和NEXT两种SR
    的头像 发表于 07-04 20:37 1089次阅读

    求助,关于SGTL5000 LINE-IN声音录制问题

    我在定制载板上运行带有 IMX8MQ 处理器的 Android 11作系统。我正在使用SGTL5000编解码器。 我正在尝试通过将麦克风连接到芯片的 Line-In 引脚来录制声音SGTL5000
    发表于 04-11 06:49

    基于小凌派RK2206开发板:OpenHarmony如何使用IoT接口控制ADC外设

    != LZ_HARDWARE_SUCCESS) { PRINT_ERR(\"%s, %s, %d: ADC Key IO Init fail\\\\n\", __FILE__, __func__, __LINE__
    发表于 04-10 16:20

    准定义、标注方法及设计选取

    一、基准的定义 首先我们要清楚关于基准的一些定义,根据国标GB/T1182、GB/T4249-1996、GB/T16671-1996中的定义。 基准要素:是指用来确定被测要素方向和位置的要素,在零件
    的头像 发表于 01-23 10:27 5984次阅读
    基<b class='flag-5'>准定义</b>、标注方法及设计选取

    TTL电平标准的介绍与解析

    逐渐成熟,并成为数字电路设计中的一个标准。 TTL电平标准定义 TTL电平标准定义了数字信号的高低电平电压范围。在TTL电平标准中,高电平
    的头像 发表于 01-16 09:46 3183次阅读

    const定义的是不是常量

    C语言是如何定义常量的?const定义的算不算是常量? 常见的有这么几种方式。 首先就是宏定义,使用 define 来定义。 宏的特点就是在
    的头像 发表于 01-14 11:35 656次阅读

    AWG与其他标准电缆的比较

    在电子和电气工程领域,选择合适的电缆对于确保设备性能和安全性至关重要。美国线规(AWG)是一种广泛使用的电线规格标准,它定义了不同直径和横截面积的电线。然而,在全球范围内,还有其他几种电缆规格
    的头像 发表于 01-13 18:07 3074次阅读

    AWG电缆线规的标准定义

    AWG(American wire gauge)电缆线规的标准定义如下: 一、基本概念 AWG是美国线规的简称,是一种区分导线直径的标准,也被称为Brown & Sharpe线规。这种标准化线规系统
    的头像 发表于 01-13 16:35 7697次阅读

    晶圆中scribe line(划片线)和saw line(锯片线)的差异

    关键的概念,它们在晶圆的后段工艺中扮演着重要的角色。为了方便理解,我们可以把晶圆比作一块大饼,而每一片芯片就像是从大饼上切下来的薄片,划片线和锯片线则是切割这些薄片的“指引”和“路径”。 Scribe Line(划片线) 定义:划片线是晶圆表面上的一系列细长的空白区域,用
    的头像 发表于 01-03 11:33 2515次阅读
    晶圆中scribe <b class='flag-5'>line</b>(划片线)和saw <b class='flag-5'>line</b>(锯片线)的差异