使用spdlog的時候win32平台如何加速編譯?
有在使用C++寫Logger的開發者一定對spdlog不陌生,header only而且寫入logger速度也不慢,但是...在win32平台會引入windows.h這個肥大的header檔案,對於大型專案相當不友好,在加上spdlog中使用了不少template,勢必使用的時候就要include進來。
好家在的是...我們在操作上使用的spdlog::logger是個class,所以我們可以在header做forward declaration,可是spdlog::logger每個寫入Log的函數都是template,要使用的時候還是要直接include,所以一個spdlog::logger包裝類就油然而生。
// forward declaration
namespace spdlog {
class logger;
namespace sinks {
class sink;
}
}
#define DECLARE_LOG_ARG_API(Name, Level) \
template \
void Log##Name(Args &&args) {\
Log(Level, nullptr, 0, nullptr, "{}", std::forward(args));\
}\
template \
void Log##Name(std::string_view s, Args &&...args) {\
Log(Level, nullptr, 0, nullptr, s, std::forward(args)...);\
}\
template \
void Log##Name(const char* filename, int32_t line, const char* func, std::string_view s, Args &&...args) {\
Log(Level, filename, line, func, s, std::forward(args)...);\
}
class Logger {
public:
explicit Logger(const std::shared_ptr< spdlog::logger >& logger);
DECLARE_LOG_ARG_API(Trace, LOG_LEVEL_TRACE)
DECLARE_LOG_ARG_API(Debug, LOG_LEVEL_DEBUG)
DECLARE_LOG_ARG_API(Info, LOG_LEVEL_INFO)
DECLARE_LOG_ARG_API(Warn, LOG_LEVEL_WARN)
DECLARE_LOG_ARG_API(Error, LOG_LEVEL_ERROR)
DECLARE_LOG_ARG_API(Critical, LOG_LEVEL_CRITICAL)
// ....
};
這樣子作法有個明顯的缺點,每次使用的時候必須要new Logger物件,總比引入windows.h來的好很多,Logger物件也只需要一開始的時候new一次即可。
留言
張貼留言