文档章节

C++不定参数打印调试信息

极客行
 极客行
发布于 2017/07/20 10:01
字数 361
阅读 53
收藏 0

编写程序时,需要写很多的调试打印信息,但是在发布程序的时候,我们又希望能隐藏这些调试信息,下面提供一种方便快捷的方法,只需要去掉宏定义,在Release版本中将不会再包含调试打印的信息,甚至调试打印的代码都不需要编译。

// debuginfo.h

#ifndef DEBUGINFO_H_
#define DEBUGINFO_H_

// If we define _DEBUG_INFO_ macro, xprint() will print valid debug info to console.
#define __DEBUG_INFO_
#ifdef __DEBUG_INFO_
#define xprint(x, ...) xpod_print(__FILE__, __FUNCTION__, __LINE__, x, ##__VA_ARGS__);
#else
#define xprint(x, ...)
#endif

#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>

inline void xpod_print(const char* file, const char* func, int line, char *fmt, ...)
{
	va_list argptr;
	va_start(argptr, fmt);
	char buffer[1024] = {0};
	vsprintf(buffer, fmt, argptr);
	va_end(argptr);

	std::cout << ">> " << buffer << " >> File=" << file << ",Func=" << func << ",Line=" << line << std::endl;
}

#endif /* DEBUGINFO_H_ */


// How to use
int main()
{
    int x = 10;
    int y = 20;
    xprint("xpod_controller start.");
    xprint("%d + %d = %d", x, y, x+y);
}

宏__DEBUG_INFO控制下面xprint宏的方式,是调用xpod_print()函数还是留空位。xpod_print实现不定参数打印调试信息,xprint宏带入文件名称,函数名称和行号,在Release版本中,只要注释掉__DEBUG_INFO宏定义即可,当然也可以使用编译器定义的_DEBUG和_RELEASE来自动选择是否要定义__DEBUG_INFO宏。同样的,xpod_print()函数除了可以打印到控制台之外,也可以扩展到打印到文件,打印到网络等,当你使用Release编译的时候,将会少去很多的代码。

 

 

 

 

 

 

 

© 著作权归作者所有

极客行
粉丝 0
博文 216
码字总数 70785
作品 0
深圳
技术主管
私信 提问
“宏”以及 release 时去掉nslog的方法&&可变参数宏

release 时去掉nslog的方法 #ifdef i386 # define NSLog(...) NSLog(VAARGS_) #else # define NSLog(...) {} // NSLog(...) 代表{},相当于 用{}代替NSLog(...) #endif 上例是用C99标准中......

JohnZr
2012/09/19
32
0
Linux中常用C/C++一些头文件的作用

1、 Linux中一些头文件的作用: <assert.h>:ANSI C。提供断言,assert(表达式) <glib.h>:GCC。GTK,GNOME的基础库,提供很多有用的函数,如有数据结构操作函数。使用glib只需要包含<glib.h...

SibylY
2013/09/25
217
0
[开源世界]从自动导出动态链接库接口看C++的缺点

自动导出动态链接库接口在C++编程中绝对是一件烦人的事情,因为你不得不大量的重复以下几个步骤: 1.加载动态链接库 2.定义导出函数指针定义 3.定义导出函数指针变量 4.从动态链接库中导出函...

梁欢
2013/10/21
530
2
OpenWRT开发之——对C++的支持(解决库依赖问题)

C++是本人的强项。如果在OpenWrt中不能用C++进行开发,那就有点大失所望了。 接下来将与大家一起来尝试写一个C++程序,并把它做成 ipk 包,并试运行。 各文件内容 在 SDK/package/ 路径下创建...

临峰不畏
2015/05/07
12.7K
9
STL list链表的用法详解

------------------------------------------------------------------------------- 原来... STL list链表的用法详解 本文以List容器为例子,介绍了STL的基本内容,从容器到迭代器,再到普通...

nao
2014/04/10
288
0

没有更多内容

加载失败,请刷新页面

加载更多

redis 学习2

网站 启动 服务端 启动redis 服务端 在redis 安装目录下 src 里面 ./redis-server & 可以指定 配置文件或者端口 客户端 在 redis 的安装目录里面的 src 里面 ./redis-cli 可以指定 指定 连接...

之渊
昨天
2
0
Spring boot 静态资源访问

0. 两个配置 spring.mvc.static-path-patternspring.resources.static-locations 1. application中需要先行的两个配置项 1.1 spring.mvc.static-path-pattern 这个配置项是告诉springboo......

moon888
昨天
4
0
hash slot(虚拟桶)

在分布式集群中,如何保证相同请求落到相同的机器上,并且后面的集群机器可以尽可能的均分请求,并且当扩容或down机的情况下能对原有集群影响最小。 round robin算法:是把数据mod后直接映射...

李朝强
昨天
4
0
Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
昨天
24
0
java数据类型

基本类型: 整型:Byte,short,int,long 浮点型:float,double 字符型:char 布尔型:boolean 引用类型: 类类型: 接口类型: 数组类型: Byte 1字节 八位 -128 -------- 127 short 2字节...

audience_1
昨天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部