Skip to content
This repository was archived by the owner on Jun 30, 2025. It is now read-only.
This repository was archived by the owner on Jun 30, 2025. It is now read-only.

Can we use google::NullStream instead of google::LogMessageVoidify in LOG_IF? #1119

@folery

Description

@folery
#define LOG_IF(severity, condition) \
  static_cast<void>(0),             \
      !(condition)                  \
          ? (void)0                 \
          : google::logging::internal::LogMessageVoidify() & LOG(severity)

This is how LOG_IF is implemented now. After reading the doc https://github.com/asplingzhang/asplingzhang.github.io/blob/main/docs/_posts/webrtc/logging/2022-06-14-why-static_cast-void-and-LogMessageVoidify-needed-in-logging-macros.md,
I understand the reason for using LogMessageVoidify, while it turns the LOG_IF from ostream into void. If someone wants to wrap LOG_IF or VLOG, it causes error:

#define VLOG(verboselevel) LOG_IF(INFO, VLOG_IS_ON(verboselevel))

#define MYLOG \
    static_cast<void>(0),             \
      !(condition)                  \
          ? (void)0                 \
          : google::logging::internal::LogMessageVoidify() & VLOG(1)

The code above causes errors like error: no match for 'operator&' (operand types are 'google::LogMessageVoidify' and 'void')
I can't use VLOG_IF in my wrapper for other reasons.

So I want to know if I can use NullStream instead like:

#define LOG_IF(severity, condition) \
      !(condition)                  \
          ? google::NullStream().stream()                \
          :  LOG(severity)

Thus LOG_IF is still an ostream and we can wrap it.
What's the difference between using google::NullStream and LogMessageVoidify?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions