使用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一次即可。

留言

這個網誌中的熱門文章

升級電腦

[心血來潮的介紹] 在我心中滿分自動筆 STAEDTLER 925 25