C++日志之获取函数的名字,行号,文件名

在后台程序运行出问题时,详尽的日志是抓错不可缺少的帮手,这里提供一个能自动记录日志触发点文件名、行号、函数名的方法,关键是利用C99新增的预处理标识符__VA_ARGS__

先介绍几个编译器内置的宏定义,这些宏定义不仅可以帮助我们完成跨平台的源码编写,灵活使用也可以巧妙地帮我们输出非常有用的调试信息。

ANSI C标准中有几个标准预定义宏(也是常用的):

__LINE__:在源代码中插入当前源代码行号;

__FILE__:在源文件中插入当前源文件名;

__DATE__:在源文件中插入当前的编译日期

__TIME__:在源文件中插入当前编译时间;

__STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1;

__cplusplus:当编写C++程序时该标识符被定义。

代码:

#define LOG(level, format, ...) /
    do { /
        fprintf(stderr, "[%s|%[email protected]%s,%d] " format "/n", /
            level, __func__, __FILE__, __LINE__, ##__VA_ARGS__ ); /
    } while (0)

int main()
{
    LOG(LOG_DEBUG, "a=%d", 10);
    return 0;
}

运行结果:
[DEBUG|[email protected],17] a=10

  

限制是format不能是变量,必须是常量字符串,如果要记录一个变量字符串,不能像printf那样printf(s)了,要LOG("DEBUG", "%s", s)。

另外还有一种:

//============================================================================
// Name : debug.cpp
// Author : boyce
// Version : 1.0
// Copyright : pku
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <stdio.h>

#define __DEBUG__

#ifdef __DEBUG__
#define DEBUG(format,...) printf("File: "__FILE__", Line: %05d: "format"\n", __LINE__, ##__VA_ARGS__)
#else
#define DEBUG(format,...)
#endif

int main(int argc, char **argv) {
    char str[]="Hello World";
    DEBUG("A ha, check me: %s",str);
    return 0;
}

  

原文地址:https://www.cnblogs.com/cthon/p/9193378.html

时间: 2024-11-05 14:58:49

C++日志之获取函数的名字,行号,文件名的相关文章

打印文件名、函数名和行号的方法

java打印文件名.函数名和行号的方法:Log.d(TAG, new Exception().getStackTrace()[0].getMethodName()); //函数名 Log.d(TAG, Thread.currentThread().getStackTrace()[2].getMethodName()); //函数名 Log.d(TAG, ""+Thread.currentThread().getStackTrace()[2].getLineNumber()); //行号

Log4j2:异步日志中打印方法名和行号信息

1. 解决方案 异步logger,还需要在pom.xml中添加disruptor的依赖: includeLocation结合异步logger使用,当其设置为true时,才会显示具体的行号,以及日志所在的类名: 如果设置为false,哪怕<Pattern>设置了输出行号也不会显示出来: 2. pom配置 <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifa

在C语言中以编程的方式获取函数名

调试常用的 __FILE__, __FUNCTION__, __LINE__ 调试常用的 __FILE__, __FUNCTION__, __LINE__ 没想到 VC6 不支持 __FUNCTION__ 所以我写了如下的奇怪代码 //用来记录当前行和当前函数//也可说是记录 堆栈void log_stack(const char *file, int line, const char * function); //当然还要对 __FUNCTION__ 宏作点修饰,因为这个宏只是在函数里面才起作

C#中的文件路径获取函数和文件名字获取函数小结

1. 获取绝对文件路径 代码如下: System.IO.Path.GetFullPath(string path) string fileName = "myfile.ext"; string path1 = @"mydir"; string path2 = @"\mydir"; string fullPath; fullPath = Path.GetFullPath(path1); fullPath = Path.GetFullPath(fil

在代码中获取调用者函数的名字【转】

转自:http://www.aiuxian.com/article/p-361301.html 有时候需要知道一个函数是被哪个函数调用的.比如,一个函数被成千上百个文件的函数调用,加入其中一个调用不对导致除了问题的话,要找出是那个地方调用的话,一个笨方法是找到每个调用的地方,加上打印信息,但这显然是不现实的.此外,有些调用的地方可能是以库的形式存在的,这样的话,就没有办法通过加打印信息找出来了. 一种较好的方法是,重新写一个同样接口的函数,里面打印出调用者函数的名字(甚至是  backtrace

一起talk C栗子吧(第一百七十五回:C语言实例--获取当前终端的行数和列数)

各位看官们,大家好,上一回中咱们说的是关闭终端中缓冲功能的例子,这一回咱们说的例子是:获取当前终端的行数和列数 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在前面章回中介绍了termios相关的信息,以及termios提供的编程接口,通过这些接口可以操作终端,今天我们再介绍一些操作终端的编程接口,通过这些接口可以获取当前终端的行数和列数,这便是我们今天的主题. int setupterm(char *term, int fd, int *errret); 该函数用来修改当前

Python日志之Python函数

Python日志之Python函数: 一.认识函数 1.什么是函数 函数,function,通俗来说,函数,就是功能的意思,函数是用来封装特定功能的,比如,在Python中,len()是一个函数,len()这个函数实现的功能可能是返回一个字符串的长度,所以说len()这个函数他的特定功能就是返回长度,再比如,我们可以定义一个函数,然后编写这个函数的功能,之后要使用的时候再调用这个函数.所以函数分为两种类型,一种是系统自带的不用我们编写其功能的,比如len()这种函数,再一种就是我们自己定义的,需

C/C++ 打印文件名、行号、函数名的方法

转自:http://blog.csdn.net/cabinriver/article/details/8960119 今天跟踪一段开源代码的时候,因为对代码不太熟悉,所以要打印一些关键的信息.便顺手整理了一下这个能打印文件名.行号.函数名的宏. 1.打印文件名.行号.函数的两种方式 [cpp] view plain copy /************************************************************************** *  @Copyri

js 获取函数的所有参数名

具体思路: 利用Function.toString()方法,获取到函数的源码,再利用正则匹配获取到参数名字. 实现代码(代码基于ES6): // 获取函数的参数名 function getParameterName(fn) { if(typeof fn !== 'object' && typeof fn !== 'function' ) return; const COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; const DEFAULT_PA