C语言几种特殊标准定义和用法
关注+星标公众号,不错过精彩内容
作者 | strongerHuang
微信公众号 | 嵌入式专栏
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等)。但是,产品后期使用中,我们对某些设备进行了升级,可能忽略了一些设备(忘记升级),如果出现故障,我们怎样才能很快找到是哪一个版本的软件出现故障呢?
嵌入式专栏
1
1.__FILE__编译文件名称
File中文意思即文件,这里的意思主要是指:正在编译文件对应正在编译文件的路径和文件的名称。
Keil版本对应的路径是相对于工程文件而言的路径,IAR版本路径是相对Windows路径。
源代码:
char BuildFile[] = __FILE__;
printf("编译文件路径:%s\n", BuildFile);
Keil:
编译文件路径:App\main.c
IAR:
编译文件路径:C:\Users\strongerHuang\Desktop\工程主目录\App\main.c
char BuildLine = __LINE__;
printf("编译代码所在行:%d\n", BuildLine);
char BuildDate[] = __DATE__;
printf("编译日期:%s\n", BuildDate);
char BuildTime[] = __TIME__;
printf("编译时间:%s\n", BuildTime);
#ifdef __STDC__
printf("标准C代码文件\n");
#else
printf("非标准C代码文件\n");
#endif
后台回复『嵌入式C语言』阅读更多相关文章。
点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。