如果需要,对宏定义或程序进行调整,并重新进行预编译观察结果: 你可以修改宏定义或程序代码,然后重新进行预编译,以观察新的预编译结果。 综上所述,通过GCC的-E选项或其他预编译器,你可以轻松地查看C语言程序在预编译阶段宏的展开结果。这有助于你理解宏在程序中的作用,以及它们如何被编译器处理。
根据DEBUG宏的值来选择对应的打印宏函数。当DEBUG的值为1时启动相关的打印调试语句,DEBUG的值为0时则关闭打印调试语句。 这样我们就可以很方便的通过设置DEBUG宏的值来启动与关闭我们整个工程的DBG_PRINTF打印调试信息。 03do{}while(0) 其实,上面我们封装的打印宏DBG_PRINTF还有一点缺陷,比如我们与if、else使用的时...
//定义打印宏,并在打印信息前加入文件名、行号、函数名 //此宏展开后,类似于printf("123"),printf("456"); #define TRACE_CMH_1 (printf("%s(%d)-<%s>: ",__FILE__, __LINE__, __FUNCTION__), printf) //此宏展开后,类似于printf("%d""%d", 1, 2); #define TRACE_CMH_2(fmt,...) ...
根据DEBUG宏的值来选择对应的打印宏函数。当DEBUG的值为1时启动相关的打印调试语句,DEBUG的值为0时则关闭打印调试语句。 这样我们就可以很方便的通过设置DEBUG宏的值来启动与关闭我们整个工程的DBG_PRINTF打印调试信息。 do{}while(0) 其实,上面我们封装的打印宏DBG_PRINTF还有一点缺陷,比如我们与if、else使用的时候...
上面的代码定义了一个函数extract_macros_from_c_file,该函数接受一个C代码文件的路径作为参数,并返回一个包含宏定义的列表。在函数内部,我们使用re模块的match方法来匹配每一行中的宏定义,并将匹配到的宏名称和值存储在列表中。 接下来,我们可以编写一个简单的示例来演示如何使用这个函数来提取宏定义并打印出来。
C语言打印程序行号、日期方便调试程序 一、前言 平时开发C语言程序时,经常需要调试代码,C语言有一些宏,可以打印出当前的行号、文件名称、日期、时间,对程序的调试起到很大的帮助,可以快速定位问题。特别是开发单片机程序时,使用这些宏打印这些信息或者在LCD上显示程序的编译日期、时间,可以知道这个单片机上的固件是什么...
调试时知道文件和行号,能够非常方便地找到打印处,并不会由于同样的信息打印无法区分 __FILE__ 路径和文件名称 __FUNCTION__ 函数名 __LINE__ 行号 __DATE__ 日期 __TIME__ 时间 补充:__VA_ARGS__ 是一个可变參数的宏,这个可变參数的宏是新的C99规范中新增的,眼下似乎仅仅有gcc支持(VC6.0的编译器不支...
1、C++11 对使用宏定义的打印,要求文本字符串与宏定义之间必须要有一个空格。 2、使用 C 语言(C11),可以直接打印出来,而不会产生警告。 小二思考了一下,这样使用的好处: 1、方便替换名字或者打印的信息。通过宏定义修改一次,即可全局修改。 2、相当于可以动态修改,如果写入固定数值,那就写死了。
一种方法是逐句进行注释,这是一种比较低效的方法。比较高效的方法就是添加调试宏开关,利用条件编译来选择打印/不打印调试信息。 比如我们可以把上面的代码改造为: #defineDEBUG 1 #ifDEBUG #defineDBG_PRINTF(fmt, args...) \ {\ printf("<<File:%s Line:%d Function:%s>> ", __FILE__, __LINE__, ...
编译型语言c是不能打印“预编译宏”的,代码在编译前的预编译步骤时,所有的宏都已经被数据代替。BBBBBB都被换成100000,再编译时已经看不到宏。编译后更只剩机器指令和数据。对于重复的常量,现代编译器通常会优化,自动归为一个数据。不需要从常量找宏 现代的IDE也会列出项目中可用的宏。找宏也简单...