你不需要通過修改main().
就應該在一個共享對象庫中創建在全局範圍內一個類來做到這一點。這個類的構造函數將在main()運行之前執行您想要執行的「初始化」,並且其析構函數將在main()之後運行。
你需要處理的問題是,這種初始化和破壞的順序是不能保證確定性至於其他任何全球範圍的對象。所有這些可以在一個.cpp
編譯單元中進行。
class LoggingManager // you can make this a singleton but not necessary
{
public:
LoggingManager();
~LoggingManager();
};
LoggingManager::LoggingManager()
{
// your initialisation code goes here
}
LoggingManager::~LoggingManager()
{
// your clean-up code goes here. It should not throw
}
LoggingManager loggingManagerStaticInstance;
注意這裏是「靜態變量初始化」問題的一小危險,這意味着在現實中你可能loggingManagerStaticInstance
不會加載,直到你的編譯單元首次訪問。
實際上,如果這是在main()
之後,只要初始化在第一次需要之前發生(有點像單例),但這意味着您的編譯單元可能需要包含可保證獲得的東西拉入英寸
如果你想「粘」到GNU或類似的,他們提供__attribute__(constructor)
可能會解決它,雖然有一個更簡單的方法有一些虛擬外部int實現或虛函數返回一個int從內部調用無論您實際使用哪種標頭來實現日誌記錄。
你爲什麼不「注入」到一個全局變量的構造函數/析構函數的啓動和關閉代碼?你留下的唯一問題是你多次這樣做;那麼它們被初始化的順序就沒有被指定,所以你不應該依賴任何。 – leemes 2014-09-29 08:45:12
如何覆蓋每個可執行文件中的主函數比在每個可執行文件中向main添加一個函數調用更容易維護? – user2079303 2014-09-29 08:47:18
這不是重複的。他沒有問過「我如何獲得代碼在main之前運行」?他已經問過如何解決問題,哪裏可能是解決方案的一部分。 – CashCow 2014-09-29 08:56:15