首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

RT-Thread、LiteOS这些操作系统中,编译出的程序为什么能打印出当前时间?

做实验引发的思考 在之前学习RT-Thread操作系统时,我发现一个比较有趣的现象: 串口打印的日志中竟然包含着当前时间!并且,我每天做实验时,这个日期都会变化,还能保持和当前时间一致!...揭晓谜底 其实,这些系统之所以准确的打印出当前时间,和板子硬件没有任何关系,更不会使用的RTC,只是在代码里巧妙的利用了C语言的一个不常用知识点 —— 编译器内置宏定义。...C语言编译器中内置了一些宏定义,这些内置宏定义可以巧妙地帮我们输出非常有用的调试信息,比如打印时间就用到了下面这两个宏定义: __DATE__:在源文件中插入当前的编译日期; __TIME__:在源文件中插入当前编译时间...RT-Thread的源码实现如下,是不是用__DATE__这个宏定义实现: void rt_show_version(void) { rt_kprintf("\n \\ | /\n");...- 2019 Copyright by rt-thread team\n"); } 再来看看LiteOS的源码实现,是不是也用__TIME__和__DATE__这两个宏定义实现: static char

79510

预处理

预处理 宏定义 作用:文本替换 提高代码的可读性 1//示例 1 2#define PI 3.1415926 带参宏 没有参数类型 也没有返回值类型 可以接受任意类型的参数 本质是替换 没有任何检查 1...(*p++):(b) 2这个表达式会产生副作用,指针p会作二次++自增操作 3开始p指向a,后来就不知道指向的是那个地址 需要注意的几点: 谨记宏定义的本质是文本替换 宏定义末尾没有分号 宏定义一般大写表示...慎用宏定义,很多坑你都找不到 特殊的宏 编译器内置的宏定义 1__LINE__ // 在源代码中插入当前源代码行号 2__FILE__ // 在源文件中插入当前源文件名 3__DATE__...__:%s\n", __DATE__); //编译日期 7 printf("__TIME__:%s\n", __TIME__); //编译时间 8 printf("__LINE...3#ifndef _TEST_H_ //防止头文件重复包含 4#define _TEST_H_ 5 6//类型定义 函数声明 宏定义 .... 7#include

78040
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C语言进阶篇】你真的了解预处理吗? 预处理详细解析

    文章目录 一、预定义符号的含义 二、#define 2.1 #define定义标识符 2.2 在define定义标识符的注意事项 三、#define 定义宏 全篇总结 一、预定义符号的含义 __FILE...__ //进行编译的源文件 __LINE__ //文件当前的行号 __DATE__ //文件被编译的日期 __TIME__ //文件被编译的时间 __STDC__ /.../如果编译器遵循ANSI C,其值为1,否则未定义 这些预定义符号都是语言内置的,每一个都有它独特的含义。...__,__TIME__ ) 2.2 在define定义标识符的注意事项 很多人以为#define的定义是一个语句,所以就想当然的给加上了一个语句但是这样就会变成造成很多语法错误,define是替换的作用并不是一条语句...机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏(define macro)。

    13110

    C语言打印程序行号、日期方便调试程序

    一、前言 平时开发C语言程序时,经常需要调试代码,C语言有一些宏,可以打印出当前的行号、文件名称、日期、时间,对程序的调试起到很大的帮助,可以快速定位问题。...特别是开发单片机程序时,使用这些宏打印这些信息或者在LCD上显示程序的编译日期、时间,可以知道这个单片机上的固件是什么时候编译。帮助判断版本。...ANSIC标准定义了可供C语言使用的预定义宏: __LINE__ : 在源代码中插入当前源代码行号 __FILE__ : 在源代码中插入当前源代码文件名 __DATE__ : 在源代码中插入当前编译日期...__TIME__ : 在源代码中插入当前编译时间 其中标识符__LINE__和__FILE__一般用来调试程序,打印信息,方便定位错误。...标识符__DATE__和__TIME__一般可以用来表示固件的版本,方便了解运行的程序是什么时候的版本。 标识符__LINE__是一个整数,其他的文件名称、日期、时间都是字符串。

    2.1K20

    程序环境和预处理

    4.预处理 1 预定义符号 __FILE__ // 进行编译的源文件 __LINE__ // 文件当前的行号 __DATE__ // 文件被编译的日期 __TIME__ // 文件被编译的时间...square(a+1); } 会换成: ((5+1)*(5+1)) 在写宏时,不要吝啬括号,能加括号的地方就加括号,会防止很多运算符优先级打乱预期的结果。...5.宏替换规则 在程序中扩展 #define 定义符号和宏时,需要涉及几个步骤: 1. 在调用宏时,首先对参数进行检查,看看是否包含任何由 #define 定义的符号。...替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替换。 3. 最后,再次对结果文件进行扫描,看看它是否包含任何由 #define 定义的符号。...宏参数和 #define 定义中可以出现其他 #define 定义的符号。 但是对于宏,不能出现递归。 2. 当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。

    36130

    C语言 第八章 函数、指针与宏

    一、函数 函数是一个包含完成一定功能的执行代码段。我们可以把函数看成一个"黑盒子", 你只要将数据送进去就能得到结果, 而函数内部究竟是如何工作的的, 外部程序是不知道的。...在宏的名字和左括号之间必须没有空格。如果有空格,预处理器会认为是在定义一个简单的宏,其中(x1,x2,…,xn)是替换列表的一部分。...: 防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif 02: 重新定义一些类型 防止由于各种平台和编译器的不同,而产生的类型字节数差异...它们是: __LINE__ __FILE__ __DATE__ __TIME__ __STDC__ C++中还定义了 __cplusplus 如果编译器不是标准的,则可能仅支持以上宏名中的几个,或根本不支持...__DATE__ 宏指令含有形式为月/日/年的串,表示源文件被翻译到代码时的日期。 __TIME__ 宏指令包含程序编译的时间。

    92250

    【C语言】预编译

    __LINE__:表示文件当前的行号。 __DATE__:表示文件被编译的日期。 __TIME__:表示文件被编译的时间。...如果表达式的值为真,则编译后面的代码直到出现 #else、#elif 或 #endif 为止,否则不编译。 #endif指令 该指令用于终止 #if 指令。...#ifdef 和 #ifndef 指令 相对于 #if 指令(检测表达式的值是否为真),#ifdef 和 #ifndef 指令用于检测指令关键字后面的宏名称是否已经定义。...其中,#ifdef 指令表示如果宏已经被定义,那么它的检测结果为真,否则返回假;而 #ifndef 指令的含义正好与 #ifdef 指令相反,它表示如果宏未被定义,那么它的检测结果为真,否则为假。...有的是为了进行一个版本之间的维护的,例如:有商业版和免费版等...当然我们还有可能使用条件编译完成其它的事情。 ⒉条件编译如何使用? 在上述条件编译讲解当中我们也说过的,这里就不在描述了。

    87810

    程序环境和预处理(1)

    这个时候程序将使用一个运行时堆栈(stack)(函数栈帧),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。...预处理详解 3.1 预定义符号 __FILE__ --> 进行编译的源文件 __LINE__ --> 文件当前的行号 __DATE__ --> 文件被编译的日期 __TIME__ --> 文件被编译的时间...__STDC__ --> 如果编译器遵循ANSI C,其值为1,否则未定义 这些预定义符号都是语言内置的。...在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号。如果是,它们首先被替换。 替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替换。...#include #define M 3 int main() { printf("M=%d\n", M);//M=3 return 0; } 3.2.4 #和## 如何把参数插入到字符串中

    10210

    C语言预处理详解

    以下是一些常见的预定义符号及其用途: __FILE__ //进⾏编译的源⽂件 __LINE__ //⽂件当前的⾏号 __DATE__ //⽂件被编译的⽇期 __TIME__ //⽂件被编译的时间 __STDC...\n", __FILE__, __LINE__, __DATE__, __TIME__); } 运行结果: 三、预处理指令详解  1.文件包含指令  #include 功能:将指定的文件内容包含到当前文件中...四、宏定义中运算符详解 在C语言的宏定义中,#和##是两个特殊的预处理器运算符,它们用于处理宏参数和宏展开时的字符串处理。理解这两个运算符的作用可以帮助你更有效地利用宏来编写灵活且强大的代码。 1....因此,CONCAT(x, y) 展开为 xy,从而使 xy 变量的值被输出。...// 头文件内容 #endif // MY_HEADER_H 或者: #pragma once 这样,就可以避免头⽂件的重复引⼊,防止编译错误。

    15410

    C语言从入门到实战——预处理详解

    __FILE__ //进行编译的源文件 __LINE__ //文件当前的行号 __DATE__ //文件被编译的日期 __TIME__ //文件被编译的时间 __STDC__ //如果编译器遵循...编译并运行该程序,输出结果为当前行号的值。 1.3 __DATE__ 在C语言中,__DATE__ 是一个特殊的预处理器宏,用于获取当前编译的日期字符串。...注意,这个日期是编译时的日期,而不是运行时的日期。每次编译程序时,__DATE__ 宏的值会自动更新为当前的日期。...__TIME__ 宏可以在程序中使用,它会在编译时被替换为一个字符串,表示编译源文件时的时间。...注意,这个时间是编译时的时间,而不是运行时的时间。每次编译程序时,__TIME__ 宏的值会自动更新为当前的时间。

    60711

    【C语言笔记】如何查看数据类型范围?

    知识点二:C语言的预定义宏 标准C语言预处理要求定义某些对象宏,每个预定义宏的名称由两个下划线开头和两个下划线结尾,这些预定义宏不能被取消定义(#undef)。...常用的几个预处理宏有: __LINE__:表示当前源代码的行号; __FILE__:表示当前源文件的名称; __DATE__:表示当前的编译日期; __TIME__:表示当前的编译时间; __FUNCTION...stdlib.h> int main(void) { printf("\n"); printf("当前代码行号:%d\n", __LINE__); printf("当前编译日期:%s\n", __DATE...__); return 0; } 程序输出结果为: 预定义宏常用于程序运行异常的跟踪,__FILE__,__LINE__,__FUNCTION__这是最常用的组合,表示文件名、行数和函数名。...除了以上提到的这五个预定义宏之外,还有C99标准提出的预定义宏如:__STDC_HOSTED__等,有兴趣的可以查一下。

    2.6K20

    初识C语言·预处理详解

    1 预定义符号 C语言里面设置了预定义符号,在预处理阶段就被处理,有以下符号: __FILE__//进行编译的源文件 __LINE__//文件当前的行号 __DATE__//文件被编译的日期 __TIME...%s\n", __FILE__); printf("%d\n", __LINE__); printf("%s\n", __DATE__); printf("%s\n", __TIME__); return...2 define定义常量 define定义常量不是宏,宏和define定义常量是有一定的区别的,宏是带有参数的,定义常量就是给常量一个值,或者是一个表达式,在预处理阶段完全替换就行了。...#define PRINT printf("%s\n%s\n%d\n%s",__FILE__,__DATE__,__LINE__,__TIME__) 这是使用续行符之前,相较于目前写的代码是比较长的,那么可以做出如下改变...,函数对应的汇编指令好像少,可实际进行调试的时候,按F11逐语句的走就会发现函数走的语句是宏定义的是几倍,这是因为函数需要创建空间,返回值,传值,计算,这些都对应了汇编语句,⽤于调⽤函数和从函数返回的代码可能

    7810
    领券