c++ - 如何在不使用宏的情况下在宏中创建条件

标签 c++ macros

我有一个名为 globals.h 的文件,如下所示:

#pragma once
#include <iostream>
#include <fstream>
#include <vector>
///Defines
//Developer tools
//IO
#define LOG if(console_verbose) if(!console_log_mode) std::cout else logfile
#define COUT std::cout
#define ENDL std::endl
#define VECTOR std::vector

//CLASS SHORTCUTS
#define CONSTR_END_GENERIC this->id = instanceCounter; instanceCounter++
#define DESTR_END_GENERIC instanceCounter--

///Namespace extensiont
namespace REBr
{
///Variables
extern constexpr bool console_verbose = true;
extern constexpr bool console_log_mode = false; ///false = log to console true = log to file
extern std::ofstream logfile("./logs/standard.log",ios::out);
};

我希望 LOG 宏像这样工作:

如果 console_verbose 为真,则启用日志记录。

如果 console_log_mode 为 false,则所有内容都将打印到控制台(使用 cout)

如果 console_log_mode 为真,所有内容都会写入日志文件(使用日志文件)

我想这样使用它:

LOG<<"Some message"<<ENDL;

它在没有文件检查的情况下工作,这是合乎逻辑的。我怎样才能让它与文件输出选项一起工作?

最佳答案

#define s 大多只是句法替换。然后像 LOG << "some message"if(console_verbose) if(!console_log_mode) std::cout else logfile << "some message" 取代这在语法上是错误的。

#define 无法解决您的问题因为当 console_verbose 时你什么都不做是false . #define s 在 C++ 中通常被认为是有害的,所以请不要在这个方向上挖掘更多。

解决方案是使用重载运算符 << 创建一个类(例如,如评论中所建议的) ,它可以用你的 bool 值实例化,这样它就会做出正确的事情。像这样的东西:

class LOG {
public:
    LOG(bool verbosity, bool mode) {...}
    template <typename T> LOG &operator<<(T v) {...}
};

关于c++ - 如何在不使用宏的情况下在宏中创建条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44693659/

相关文章:

c - Atmel C 引脚操作宏

c++ - 在堆栈中创建对象时,即使代码覆盖率为 100%,函数覆盖率也较低

c++ - CString 标记化问题

unit-testing - 如何在使用 throw-with-msg 的测试中捕获 IllegalArgumentException?

c - C中难以理解的类似函数的宏

c++ - 在 Visual Studio 2010 的 CMake 中定义宏 "disallow copy and assign"

c++ - 如何有效地将二进制文件读入 vector C++

C++单例继承问题

c++ - 为什么可以 move 不可变的 lambda 捕获?

c++ - 从编译传递的宏无法在 Eclipse 中解析