首页 > 代码库 > Duanxx的C++学习: 使用__FILE__,__LINE__,__VA_ARGS__调试代码

Duanxx的C++学习: 使用__FILE__,__LINE__,__VA_ARGS__调试代码

 __FILE__,__LINE__


在调试C/C++代码的时候,我们最想知道的,当然是程序当前走到了哪个文件的第几行了,这里有两个宏:__FILE__和__LINE__,返回的是当前文件的路径,和当前行。

 

这里测试代码如下:

#include <cstdio>

int main()
{
  printf("%s : %d",__FILE__,__LINE__);
  printf("\n");

  return 0;
}


Windows下运行结果为:






Linux系统运行结果如下:




         可以看到,在Windows下,__FILE__返回的是完整路径,而在Linux下使用g++编译,返回的只是文件名







__VA_ARGS__


这个是从C99开始支持的可变参数宏,以前在C语言中,只支持函数的可变参数


比如我们最常见的printf函数:

void printf(const char* format, …);

         这里的省略号…,就是可变参数

 

而__VA_ARGS__这个宏就是实现了宏的可变参数:

#define debug(…) printf(__VA_ARGS__)

测试代码如下:

#include <cstdio>

#define DEBUG(...) printf(__VA_ARGS__)

int main()
{
  DEBUG("duanxx %d\n",123);

  return 0;
}

Windows下的运行结果:



Linux下的运行结果:








一行调试宏

有了上面的说明,就可以写出下面的调试宏:

#define DEBUG(fmt, ...)   fprintf(stdout, "%s:%d Duanxx Debug   " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__)



测试代码:

#include <cstdio>

#define DEBUG(fmt, ...)   fprintf(stdout, "%s:%d Duanxx Debug   " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__)

int main()
{

  DEBUG("duanxx %d\n",123);

  return 0;
}




Windows下结果:





Linux下的结果:




Duanxx的C++学习: 使用__FILE__,__LINE__,__VA_ARGS__调试代码