c++代码调试的小技巧

  介绍

这篇文章给大家分享的是有关c++代码调试的小技巧的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。

代码调试在程序开发阶段占有举足轻重的地位,可见代码调试的重要性。但是有一点必须强调:程序是设计出来的,而不是调试出来的。这是所有程序员必须牢记在心的一条准则。一个没有设计或者这几得很糟糕的程序,无论怎样调试,也不会成为一个合格的程序。

程序有着良好的设计的前提下,软件开发的过程中,编码错误在所难免。所有程序可能出现的错误可分为两类:语法错误和逻辑错误。调试通常是指在消除了语法错误之后,发现程序中的逻辑错误的过程。对c/c++程序进行调试,有这样集中常用的手段。它们既可以单独使用,也可以配合使用。

<强> 2.1使用打印语句

这是最朴素,也是最直接的方法。程序的运行可以看成是一组变量(状)态不断变化的过程,这个过程就是数据处理的过程。如果程序的最终结果不对,那么我们必须考虑这一组状态什么时候出现了问题,而查看中间结果就成了一种最有效的手段。

因此,不要过分迷信功能强大的调试工具。在大部分情况下,程序出现的问题都是一些小问题。而正是这些小问题,却造成了大麻烦。程序员可以通过对最有可能出错的代码附近使用简单的printf()语句或cout<& lt;…语句来输出中间结果,查看异常情况。

<强> 2.2使用调试标记

在调试程序的时候使用相应的辅助代码(如输出中间结果等),在调试完成之后隐藏这些代码,是一种常用的调试策略。

这种策略可以借助于#定义,# ifdef, # endif这三个与编译指令来实现。具体地说,就是在调试程序的时候,利用编译器的命令行参数定义调试标记(相当于程序中用# define定义的宏),然后再# ifdef和# endif之间包含相应的调试代码就可以了。当程序最终调试完成后,在生成发行版时,只要在编译器命令行参数中不再提供调试标记,程序中的调试代码就会消失。常用的调试标记为_DEBUG(在vc++ 2012)中,编译器调试版的程序是会缺省定义宏_DEBUG。考察如下程序。

 # include & lt; iostream>
  使用名称空间性病;
  
  int main ()
  {
  int i=5;
  # ifdef _DEBUG
  cout<& lt; i<& lt; endl;
  #endif
  cout<& lt;“Hello World !“& lt; & lt; endl;
  }

在调试程序的时候,会执行# ifdef和# endif之间的语句。当调试完成之后,由于调试标记_DEBUG失去定义,从而隐藏调试代码。

<强> 2.3使用调试变量

与使用调试标记的方法类似,可以在运行时设置一个供调试用的bool型变量,它的值决定了特定调试代码的开放和关闭,并且可以通过程序的命令行参数来控制该变量的开关。上面的程序经过修改如下。

 # include & lt; iostream>
  # include & lt; string>
  使用名称空间性病;
  
  bool调试;
  
  int主要(int命令行参数个数,char * argv [])
  {
  int i=5;
  (int j=0; j<命令行参数个数;+ + j)
  {
  如果字符串(argv [j])==?知道;调试)
  {
  debug=true;
  }
  }
  如果(调试)
  {
  cout<& lt; i<& lt; endl;
  }
  cout<& lt;“Hello World !“& lt; & lt; endl;
  }

程序通过命令行启动时,只要在命令行参数中指明debug=,就可以输出调试信息。否,则只是输出程序”正常“运行的部分。这样就具有较高的灵活性。

<强> 2.4使用内置的调试宏

在程序调试的过程中,经常希望知道当前运行的是哪个模块小的哪个函数,在源文件中是第几行等等。如果手工添加这些信息,无疑会给程序员带来很大的负担,因此,c++提供了几个宏,他们分别是<代码> __FILE__ ,<代码> __FUNCTION__ 和<代码> __LINE__>

 # include & lt; iostream>
  使用名称空间性病;
  
  空白func1 ()
  {
  cout<& lt; __FILE__<& lt; endl;
  }
  
  空白func2 ()
  {
  cout<& lt; __FUNCTION__<& lt; endl;
  }
  
  空白func3 ()
  {
  cout<& lt; __LINE__<& lt; endl;
  }
  
  int主要(int命令行参数个数,char * argv [])
  {
  func1 ();
  func2 ();
  func3 ();
  }

在本人的机器上输出如下信息:

e: \ 2015.10.23 \ \ lvlv_study \ synchronousfile \学校编程\调试\ main.cpp

c++代码调试的小技巧