我有一个名为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为true,则启用日志记录。
如果console_log_mode为false,则所有内容都将打印到控制台(使用cout)
如果console_log_mode为true,则所有内容都将写入日志文件(使用日志文件)
我想这样用:
LOG<<"Some message"<<ENDL;
它没有文件检查,这是合乎逻辑的。如何使用文件输出选项?
答案 0 :(得分:3)
#define
s大多只是语法替换。然后LOG << "some message"
之类的内容被if(console_verbose) if(!console_log_mode) std::cout else logfile << "some message"
替换,这在语法上是错误的。
#define
console_verbose
为false
时,您无法解决问题#define
。 <<
通常被认为在C ++中是有害的,所以请不要在这个方向上挖掘更多。
解决方案是使用重载的运算符class LOG {
public:
LOG(bool verbosity, bool mode) {...}
template <typename T> LOG &operator<<(T v) {...}
};
创建一个类(例如并在注释中建议),该运算符可以与您的布尔值一起实现,以便写到它会做出正确的事情。类似的东西:
on-tag-adding="emailcheck($tag)"