2013-07-07 56 views
3

是否有一個跨平臺的方式來檢測調試模式編譯?如果不是,那麼如何爲頂級編譯器做到這一點; MSVC,GNU & MINGW,MAC,鐺,英特爾。是否有跨平臺的方式來檢測調試模式編譯?

例如MSVC可以檢測調試模式如下所示。

#if defined _DEBUG 
// debug related stuff here 
#else 
// release related stuff here 
#endif 
+3

標準說,如果'NDEBUG'被定義,則assert'的'的定義將是什麼(這實際上意味着「釋放模式」)。您可能可以檢查'#ifndef NDEBUG'來獲取想要的行爲。 – Xeo

+0

調試版本和發佈版本在MSVC之外沒有很好的定義。爲什麼不問誰在使用你的代碼來定義什麼時候他們正在調試呢? –

回答

6

對於許多或大多數編譯器來說,「調試」模式是一個多方面的概念,包括幾個正交設置。例如,對於gcc,可以使用-g將調試符號添加到輸出代碼,使用-O啓用優化,或使用-DNDEBUG(定義NDEBUG宏)禁用assert()宏。在我的工作中,我們已經部署了具有許多啓用或禁用組合的生產代碼。我們爲了連接到正在運行的進程,並將它們用gdb(在這種情況下,我們通常有意大利麪條-O產生對抗),在獲取有關跨版本持久性錯誤的詳細信息留下的斷言,並禁用優化的解決留下-g上遺留的代碼庫是根據對「未定義的行爲」的更寬容的解釋編寫的(直到我們可以修復/替換它)。

由於NDEBUG宏實際上會影響生成的代碼的語義(並且某些庫在宏定義或不定義時會更改它們的ABI),所以這可能是對您的問題最可移植的答案。但是,如果您正在使用該宏來輕鬆檢測優化構建,那麼您可能會取得混合成功。

相關問題