如何为 glog 的宏重载 <<

这篇具有很好参考价值的文章主要介绍了如何为 glog 的宏重载 <<。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

<2023-03-21 周二>

如何为glog的宏重载<<

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

#ifdef _DEBUG
    LOG(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

说明:文章来源地址https://www.toymoban.com/news/detail-799339.html

  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 的宏重载 <<的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【与chatGPT讨论TypeScript中重载与c#语言中重载的问题】

    在 TypeScript 中,函数重载是指可以定义多个具有相同名称但参数列表或返回类型不同的函数。函数重载的主要目的是为了让编译器可以对函数调用进行类型检查,从而提高代码的安全性和可维护性。 一个函数的重载需要在同一个作用域中定义,使用 function 声明多个具

    2024年02月04日
    浏览(39)
  • Glog安装与使用

    脚本 main.cc cmake文件 Todo 补充

    2024年02月11日
    浏览(33)
  • Rust UI开发(二):iced中如何为窗口添加icon图标

    注:此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库,用于为rust语言程序构建UI界面。 想要了解如何构建简单窗口的可以看本系列的第一篇: Rust UI开发:使用iced构建UI时,如何在界面显示中文字符 本篇是系列第二篇,主要解决一个问题,就是为窗口添加图标ic

    2024年02月04日
    浏览(62)
  • Go语言支持重载吗?如何实现重写?

    Go语言不支持传统意义上的函数和方法重载。在Go语言中,函数名或方法名不能相同但参数列表不同,因为这会导致编译错误。 然而,可以通过方法重写(override)来实现类似的功能。方法重写是指在子类中定义一个与父类同名的方法,从而覆盖父类中的方法。 下面是一个简

    2024年04月09日
    浏览(47)
  • Java语言中的重写和重载

    重写(override)和重载(overload)是编程语言中的两个常见概念,用于描述函数或方法的特定行为。 重写 指的是在子类中重新定义(覆盖)父类中已经存在的同名方法。重写可以修改或扩展父类的方法实现,使其更适合子类的需求。在重写中,子类方法的名称、参数类型、返

    2024年02月03日
    浏览(47)
  • QT调用glog日志流程

    glog日志库是Google开源的轻量级的日志库,平时在开发过程中经常要使用到日志,本篇记录Qt项目使用glog日志库的记录。 1.首先下载cmake,Download | CMake 安装设置环境变量,检查安装情况 2.下载glog源码 github网站比较慢,而且容易断线,可以用国内的境像 git clone https://gitee.com/

    2024年02月12日
    浏览(54)
  • 低代码开发的一些见解:何为低代码、优缺点、如何入门及平台介绍

    低代码是一种软件开发方法,它旨在通过最大程度地减少手动编码来加快应用程序的开发速度和降低技能门槛。低代码开发平台提供了一系列工具和组件,使开发人员能够使用图形化界面、拖放式操作等方式来快速构建应用程序,而无需深入的编程知识。 低代码开发平台通常

    2024年02月04日
    浏览(53)
  • Go语言热重载和优雅地关闭程序

    我们有时会因不同的目的去关闭服务,一种关闭服务是终止操作系统,一种关闭服务是用来更新配置。 我们希望优雅地关闭服务和通过热重载重新加载配置,而这两种方式可以通过信号包来完成。 首先,定义了一个 Config 结构并声明了一个 conf 变量。 这里的代码只是一个简

    2024年01月17日
    浏览(51)
  • 【正点原子STM32】C语言重点知识(配置MDK支持C99、位操作清零置一、带参数的宏定义、头文件的条件编译和代码条件编译、关键字、结构体指针、代码规范)

    一、stdint.h简介 配置MDK支持C99 二、位操作 如何给寄存器某个位赋值(清零置一) 三、宏定义 带参数的宏定义 四、条件编译 头文件的条件编译和代码条件编译 五、extern声明 六、类型别名(typedef) 类型别名应用 七、结构体 应用举例(定义使用) 应用举例(ST源码,使用类型

    2024年02月19日
    浏览(44)
  • 苹果开发初学者指南:Xcode 如何为运行的 App 添加环境变量(Environmental Variable)

    Xcode 15 在运行 SwiftUI 代码时突然报告如下警告: Error: this application, or a library it uses, has passed an invalid numeric value (NaN, or not-a-number) to CoreGraphics API and this value is being ignored. Please fix this problem. 不仅如此,Xcode 调试控制台中还提示我们需要添加特定的环境变量以进一步与该错误“

    2024年04月24日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包