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

时间:2017-06-22 08:06:18

标签: 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为true,则启用日志记录。

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

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

我想这样用:

LOG<<"Some message"<<ENDL;

它没有文件检查,这是合乎逻辑的。如何使用文件输出选项?

1 个答案:

答案 0 :(得分:3)

#define s大多只是语法替换。然后LOG << "some message"之类的内容被if(console_verbose) if(!console_log_mode) std::cout else logfile << "some message"替换,这在语法上是错误的。

#define console_verbosefalse时,您无法解决问题#define<<通常被认为在C ++中是有害的,所以请不要在这个方向上挖掘更多。

解决方案是使用重载的运算符class LOG { public: LOG(bool verbosity, bool mode) {...} template <typename T> LOG &operator<<(T v) {...} }; 创建一个类(例如并在注释中建议),该运算符可以与您的布尔值一起实现,以便到它会做出正确的事情。类似的东西:

on-tag-adding="emailcheck($tag)"