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下的结果:

时间: 10-29

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

__FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程 )

[email protected]:~/cpropram/2# cat global.h //头文件#ifndef CLOBAL_H        #define GLOBAL_H        #include <stdio.h>        int funca(void);        int funcb(void);#endif[email protected]:~/cpropram/2# cat funca.c //函数a#include "global.h"i

C/C++ __FILE__,__LINE__输出调试信息

在写程序的时候,总是或多或少会加入一些printf之类的语句用于输出调试信息,但是printf语句有个很不方便的地方就是当我们需要发布程序的时候要一条一条的把这些语句删除,而一旦需要再次调试的时候,这些语句又不得不一条条的加上,这给我们带来了很大的不便,浪费了我们很多的时间,也造成了调试的效率低下.所以,很多人会选择使用宏定义的方式来输出调试语句. 编译器内置宏,ANSI C标准中有几个标准预定义宏(也是常用的): __LINE__:    在源代码中插入当前源代码行号: __FILE__:  

Duanxx的图像处理学习: 透视变换(二)

在<Duanxx的图像处理学习:透视变换(一)>中简要的说明了透视变化的算法,这里再进一步的对透视变换做说明. 基于前面的说明,可以很容易发现, 一个变换矩阵有如下你的分区特性: 一般来说,我有一个三维变换矩阵如下: 矩阵中的元素(p , q , r)取非全0时,能产生透视效果 一.一点透视 来看下面一张图: 现在是以z轴上的一点(0,0,d,1)为投影中心,计算P(x,y,z,1)点在XOY平面上的透视投影. 那么,现在很容易知道: 即: 这里取: 那么变换矩阵T,就为: 结果的其次坐标表示

__FILE__,__LINE__

编译器内置宏: 先介绍几个编译器内置的宏定义,这些宏定义不仅可以帮助我们完成跨平台的源码编写,灵活使用也可以巧妙地帮我们输出非常有用的调试信息. ANSI C标准中有几个标准预定义宏(也是常用的): __LINE__:在源代码中插入当前源代码行号: __FILE__:在源文件中插入当前源文件名: __DATE__:在源文件中插入当前的编译日期 __TIME__:在源文件中插入当前编译时间: __STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1: __cplusplus:当编写C

Duanxx的神经网络学习: 自己动手写神经网络(二) 前馈网络的实现

本文是继续Duanxx的神经网络学习: 自己动手写神经网络(一) 搭建一个简单的网络框架 写的第二篇文章,将神经网络的前馈网络实现并测试. 本文的代码下载地址 1 为神经元Neuron添加权Weight 在上一篇文章中,我已经搭起了一个神经网络的框架. 但是那只是一个框架而已,什么都没有是实现,而这个框架的最基本的东西就是神经元Nenron,这里就考虑将Neuron实现一下. 对于一个神经元而言,它的输入是上一层神经元的输出,可以不用太关心,它也有自己的输出outputvalue,同时,它还要控

Duanxx的图像处理学习: 透视变换(三)

我们常见的坐标系是笛卡尔坐标系,也就是在<Duanxx的图像处理学习:透视变换(一)>中提到的世界坐标系. 而从观察这的角度来看的话,就是<Duanxx的图像处理学习:透视变换(一)>中提到的摄像头坐标系. 在观察者坐标系(摄像头坐标系)中,我们一般以观察者(或者叫做视点)为观察者坐标系的原点,以观察点到物体的方向为z轴,以向左且与z轴垂直的方向为x轴,与x轴和y轴垂直向上的方向作为y轴,构成观察者坐标系. 因为本文所有的操作都是基于<Duanxx的图像处理学习:图像变换 三

__FILE__,__LINE__,__FUNCTION__的问题

#define MYCODE __FILE__,__LINE__,__FUNCTION__#define MYCODE2 mycall(__FILE__,__LINE__,__FUNCTION__); void mycall(char* file=__FILE__,int line=__LINE__,const char* function=__FUNCTION__){ printf("%s:%d %s\n",file,line,function); printf("%s:%

C/c++几个预定义的宏:__DATE__,__TIME__,__FILE__,__LINE__

一边情况下,C/C++编译器会内置几个宏,这些宏定义不仅可以帮助我们完成跨平台的源码编写,灵活使用也可以巧妙地帮我们输出非常有用的调试信息. ANSI C标准中有几个标准预定义宏(也是常用的): __LINE__:在源代码中插入当前源代码行号: __FILE__:在源文件中插入当前源文件名: __DATE__:在源文件中插入当前的编译日期 __TIME__:在源文件中插入当前编译时间: __STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1: __cplusplus:当编写C++

__FILE__,__LINE__,__DATE__,__TIME__ c++常用的预定义名字

C++有四个常用的预定义名字,分别为:__FILE__,__LINE__,__DATE__,__TIME__ __FILE__:记录文件的路径加名称 __LINE__:记录文件已经被编译的行数 __DATE__:记录文件的编译日期 __TIME__:记录文件的编译时间 可以当作变量直接使用,一般用作程序调试 例子: #include <iostream> using namespace std; int main(){     cout << "File = "