让C语言的调试更加高大上

简介: 让C语言的调试更加高大上

一般在写一个项目的时候,为了更直观的调试,我们在程序里都会打printf调试语句,随着项目越写越多,printf也会越来越多,但项目准备结尾的时候,这时候开始优化就会发现,你想完全把printf语句都删除了,又怕后面项目出问题找不到问题点在哪里,不删项目一执行就有好多调试语句干扰观察,同时还会拖慢系统,影响效率,这点在单片机上是见怪不怪了,还有一种情况,有时候打印会打相同的消息,这样就分不清到底是哪个函数打印的,于是找问题都要找好久,于是我们需要一个更加有艺术感的调试封装。

#define __DEBUG_VERSION
#ifdef __DEBUG_VERSION
    #define DEBUG(format,...)  printf("[File:%s, Line:%d] "format, __FILE__, __LINE__, ##__VA_ARGS__)
#else
    #define DEBUG(format,...)
#endif

如上代码,当定义了__DEBUG_VERSION,使用DEBUG函数就会执行


printf("[File:%s, Line:%d] "format, __FILE__, __LINE__, ##__VA_ARGS__)

如果没有定义,那么就什么都不会执行,我们可以在第一篇文章那个例程里实验看看:

#include <stdio.h>
#include "iniparser.h"
#define CONFIG_NAME "Config.ini"
#define __DEBUG_VERSION
#ifdef __DEBUG_VERSION
    #define DEBUG(format,...)  printf("[File:%s, Line:%d] "format, __FILE__, __LINE__, ##__VA_ARGS__)
#else
    #define DEBUG(format,...)
#endif
void Create_Default_InI_File(void)
{
    FILE *Default_ini = NULL ;
    Default_ini = fopen(CONFIG_NAME,"w");
    fprintf(Default_ini,
        "[Setting]\n"
        "INIT_FLAG=0;\n"
        "VOLUME=1;\n"
        "LANGUAGE=1;\n"
    );
    fclose(Default_ini);
}
int main(void)
{
  int Init_flag ;
  int Volume_flag ;
  int English_flag ;
  /*1、创建一个默认的Config.ini文件*/ 
    Create_Default_InI_File();
    /*2、解析Config.ini文件获得参数*/
    dictionary  *Config_ini = NULL;
    /*3、加载Config.ini文件*/ 
    Config_ini = iniparser_load(CONFIG_NAME);
    if(NULL == Config_ini)
    {
      printf("cannot parse %s file\n",CONFIG_NAME);
      return -1 ;
  }
  /*4、将字典转储到打开的文件指针。*/
  iniparser_dump(Config_ini,stderr);
  /*5、分别获取上述创建的InI文件里的几个项目的值*/
  Init_flag = iniparser_getint(Config_ini,"Setting:INIT_FLAG",-1);
  Volume_flag = iniparser_getint(Config_ini,"Setting:VOLUME",-1);
  English_flag = iniparser_getint(Config_ini,"Setting:LANGUAGE",-1);
  DEBUG("Init_flag:%d\n",Init_flag);
  DEBUG("Volume_flag:%d\n",Volume_flag);
  DEBUG("English_flag:%d\n",English_flag);
  /*5、更改其中的INIT_FLAG项的值*/
  iniparser_set(Config_ini,"Setting:INIT_FLAG","1");
  Init_flag = iniparser_getint(Config_ini,"Setting:INIT_FLAG",-1);
  Volume_flag = iniparser_getint(Config_ini,"Setting:VOLUME",-1);
  English_flag = iniparser_getint(Config_ini,"Setting:LANGUAGE",-1);
  DEBUG("Init_flag:%d\n",Init_flag);
  DEBUG("Volume_flag:%d\n",Volume_flag);
  DEBUG("English_flag:%d\n",English_flag);
  /*6、释放字典*/
  iniparser_freedict(Config_ini);
    return 0;
}

运行结果:

640.png

当你打印的时候,调试会告诉你这是哪个文件哪一行打的,是不是很方便?但是这样的仅仅起到一个要不全部不执行,要不全执行的效果。如果想做更强大一点,那我们可以结合C语言宏定义的特性把这个再给优化一下,这点留给读者自己去尝试。

目录
相关文章
|
程序员 C语言
C语言--调试技巧(下)
C语言--调试技巧(下)
|
6月前
|
C语言
C语言使用宏定义实现等级调试输出PRINT_LEVEL
C语言使用宏定义实现等级调试输出PRINT_LEVEL
125 0
|
1月前
|
C语言
C语言调试
C语言调试
17 0
|
3月前
|
C语言 索引
C语言编译环境中的 调试功能及常见错误提示
这篇文章介绍了C语言编译环境中的调试功能,包括快捷键操作、块操作、查找替换等,并详细分析了编译中常见的错误类型及其解决方法,同时提供了常见错误信息的索引供参考。
|
5月前
|
存储 编译器 C语言
C语言学习记录——调试技巧(VS2019环境下)
C语言学习记录——调试技巧(VS2019环境下)
53 2
|
6月前
|
NoSQL Linux Redis
redis源码调试---vscode使用技巧-----C语言跳转到函数定义
redis源码调试---vscode使用技巧-----C语言跳转到函数定义
116 0
|
5月前
|
程序员 编译器 C语言
C语言中的assert.h:调试助手与断言详解
C语言中的assert.h:调试助手与断言详解
|
6月前
|
程序员 C语言 C++
C语言实用的调试技巧
C语言实用的调试技巧
48 3
|
6月前
|
程序员 编译器 测试技术
C语言初阶⑨(调试)(如何写出好的代码)(模拟实现strcpy和strlen)
C语言初阶⑨(调试)(如何写出好的代码)(模拟实现strcpy和strlen)
47 1
|
程序员 C语言
【C语言】如何写出好(易于调试)的代码——assert和const的使用
【C语言】如何写出好(易于调试)的代码——assert和const的使用
49 0