如何为 glog 的宏重载 <<

2024-01-16 13:52
文章标签 重载 glog

本文主要是介绍如何为 glog 的宏重载 <<,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

<2023-03-21 周二>

如何为glog的宏重载<<

为什么要为glog重载<<呢?因为如果在windows平台上只想在Debug模式下使用glog,不重载<<的话,可能大概率会写出下面这样的代码,并且如果有一处漏掉#ifdef语句的话,Release模式下编译也会失败;此外导致代码非常不简洁:

#ifdef _DEBUGLOG(ERROR) << "error";
#endif

所以我想在编译Release版本时在没有这种预处理指令#ifdefglog的宏依然能编译通过且没有任何作用,所以必须重载<<。最终我找到了解决办法,参考了glog的源代码LogMessage类的写法。

// xxx.h#ifdef _DEBUG
#define GLOG_NO_ABBREVIATED_SEVERITIES
#include <glog/logging.h>#pargma comment(lib, "glogd.lib")
#else // _DEBUG
class log2void : public std::ostream {
public:log2void() : std::ostream(NULL) {OutputDebugStringA("log2void ctor");}
};extern log2void L2V;#define LOG_IF(a, b) L2V
#define LOG(a)       L2V
#define VLOG(a)      L2V
#endif // _DEBUG
// xxx.cpp#include "xxx.h"#ifdef _DEBUG
#else
log2void L2V;
#endif

说明:

  1. 为什么要有全局变量L2V?因为不用全局变量的话,在每次调用glog宏时都会有log2void的构造成本产生,经过调试发现构造涉及的初始化类较多,个人认为影响性能。或者也可以直接在头文件中定义static log2void L2V;静态变量,也减少了构造的次数,只不过每个源文件中都会有一个L2V的实例,比全局变量的效果次点。
  2. 为什么要继承自std::ostream?这主要就是为了方便,可以利用std::ostream的代码,不用自己重载<<,要知道在std::ostream中已经重载好的<<函数有不下十几个,因为要考虑参数类型的问题、返回值问题、一个语句中有多个<<等问题。之前就自己写<<重载函数,返回void,这种写法对于一个语句中有多个连续的<<情况,编译时就会报错了
  3. 为什么std::ostream(NULL)初始化为NULL?因为这样的话,流的good()函数就返回false,可以自己调试<<的代码来理解。这样就减少了<<Release版本中运行的指令的数量,避免日志输出对程序运行造成性能影响。

这篇关于如何为 glog 的宏重载 <<的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/612812

相关文章

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

第二十四章 rust中的运算符重载

注意 本系列文章已升级、转移至我的自建站点中,本章原文为:rust中的运算符重载 目录 注意一、前言二、基本使用三、常用运算符四、通用约束 一、前言 C/C++中有运算符重载这一概念,它的目的是让即使含不相干的内容也能通过我们自定义的方法进行运算符操作运算。 比如字符串本身是不能相加的,但由于C++中的String重载了运算符+,所以我们就可以将两个字符串进行相加、但实际

C++可以被重载的操作符Overloadable operators

C++允许绝大多数操作符被重载,也就是重新定义操作符实现的功能,这样它们的行为可以被设计出来以适应所有的数据类型,包括类。 以下是C++可以被重载的操作符(Overloadable operators): //四则运算符+ - * / %+= -= *= /= %=//比较运算符> >= == != //赋值运算符= //位操作

c++/《重载操作符》

为什么要对运算符进行重载:         C++预定义中的运算符的操作对象只局限于基本的内置数据类型,但是对于我们自定义的类型(类)是没有办法操作的。但是大多时候我们需要对我们定义的类型进行类似的运算,这个时候就需要我们对这么运算符进行重新定义,赋予其新的功能,以满足自身的需求。 <返回类型说明符> operator <运算符符号>(<参数表>) { <函数体> }

java基础总结10-面向对象6(方法的重载)

1 方法的重载 方法名一样,但参数不一样,这就是重载(overload)。   所谓的参数不一样,主要有两点:第一是参数的个数不一样,第二是参数的类型不一样。只要这两方面有其中的一方面不一样就可以构成方法的重载了。 package cn.galc.test;public class TestOverLoad {void max(int a, int b) {System.out.prin

C++ 第7章 运算符重载

7.1 运算符重载规则 7.1.1 重载运算符的限制 可重载运算符: + - * / % ^ & | ~! = < > += -+ *= /= %=^= &= |= << >> >>= <<= == !=<= >= && || ++ -- ->* , ->[] () new delete 不可重载运算符: . .* :: ?: sizeof 重载运算符函数可以对运算符做出新的解

谈谈函数返回值为什么不能重载

一、函数的定义:       函数将有效的输入值变换为唯一的输出值,同一输入总是对应同一输出。       计算机本质是对抽象数学公式的具体实现,并以此具体实现来解决现实生活中的实际问题。 注:wiki百科对 “函数” 的定义如图,图比较大,请点击打开详情,左右拖动查看 全部内容。 二、悖论      反过来设想一下,如果返回值的类型 能用来 重载,那么对于相同的输入值,程序怎么决定

12 Python面向对象编程:运算符重载

本篇是 Python 系列教程第 12 篇,更多内容敬请访问我的 Python 合集 在理解运算符重载之前我们已经知道了什么是方法重载,方法重载就是子类继承父类并且定义了一个和父类一样的方法。 知道了什么是重载,也知道了什么是运算符(加减乘除等),那么运算符重载也很好理解了,其实就是在类里面也定义一些特殊方法,使得调用这些方法能实现类对象的加减乘除。当然方法名不是随意取的,要和运算符对应

Java中的重载感悟

引言 在面向对象编程语言中,方法重载(Overloading)是一种允许创建具有相同名称但参数列表不同的多个方法的功能。这种方法提高了代码的可读性和组织性,同时也简化了接口设计。本文将详细介绍Java中的方法重载概念、其实现方式以及一些最佳实践。 什么是方法重载? 方法重载是指在同一类中可以定义多个同名的方法,但是这些方法的参数列表必须有所不同。参数列表的不同可以体现在参数的数量、类型或顺序上。

c++类 重载 继承 多态

知识点总结 一·运算符重载 将运算符看作是一种特殊的函数,将操作数看作参数,运算结果作为返回值。如果运算符也可以被看作是函数则也可以重载。 因为运算符只限制于系统本来就定义好的数据类型如int,double等。 1.重载方式 类似于普通函数但函数名由关键字operator和要重载的符号,返回值类型为运算值结果的类型。参数表是参与运算的操作数。参数个数取决于操作数个数和是在类内定义还是类外定义。 特