c++ logging - how to write a conditional macro for insertion operator that does nothing -


i have piece of code uses plog logging, below:

int main(int argc, char** argv) {    static plog::colorconsoleappender<plog::txtformatter> consoleappender;   plog::init(plog::verbose, &consoleappender);    // log severity levels printed in different colors.   log_verbose << "this verbose message";   log_debug << "this debug message";   log_info << "this info message";   log_warning << "this warning message";   log_error << "this error message";   log_fatal << "this fatal message";    return 0;  } 

as code going part of library, don't want emit logs until / unless enabled application using it. so, trying see, if can make above logging code ineffective via macro definitions. tried following, results in compilation errors:

#ifdef no_logging #undef log_verbose  #define log_verbose {} #undef log_debug  #define log_debug {} #undef log_info  #define log_info {} #undef log_warning  #define log_warning {} #undef log_error  #define log_error {} #undef log_fatal  #define log_fatal {} #endif 

this results in compilation error

log_test.cpp:25:15: error: expected expression   log_verbose << "this verbose message" ;               ^ log_test.cpp:26:13: error: expected expression   log_debug << "this debug message";             ^ log_test.cpp:27:12: error: expected expression   log_info << "this info message";            ^ log_test.cpp:28:15: error: expected expression   log_warning << "this warning message";               ^ log_test.cpp:29:13: error: expected expression   log_error << "this error message";             ^ log_test.cpp:30:13: error: expected expression   log_fatal << "this fatal message";             ^ 

is there way around problem , have proper disabling of logs?

your best bet this:

struct black_hole_t {     template <typename t> black_hole_t operator<<(t &&)     {         return {};     } };  black_hole_t black_hole;  #define log_blah black_hole  // or #define log_blah black_hole_t{} // gcc generates 1 more instruction @ -o0, // hurts inner love premature optimizations. 

and hope compiler optimize no-op.

gcc 7.2 no-ops -o1, clang 4.0 requires @ least -o2.


Comments

Popular posts from this blog

What is happening when Matlab is starting a "parallel pool"? -

angular - DownloadURL return null in below code -

php - Cannot override Laravel Spark authentication with own implementation -