我有一个名为 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/