2012-07-27 21 views
1

我正在寫一個包含許多斷言的庫。在開啓斷言的情況下,庫變得更慢,並且庫的整個關鍵點是速度很快,所以斷言在測試或診斷錯誤時纔有意義。我使用的是autoconf,這似乎是標準做法,要求用戶知道這個問題並通過一個標誌來配置禁用斷言。在這種情況下,只有專家用戶纔會知道安裝適當版本的庫!那真的是我應該做的嗎?如果是這樣,除了「這是專家用戶和其他程序員會期待什麼?」之外,是否有很好的理由?默認情況下庫構建系統是否應該關閉斷言?

編輯:Here's的討論,說明你不應該被默認在釋放模式,定義NDEBUG雖然沒有其他原因,因爲它是令人驚訝地做到這一點的例子。

+1

您應該構建庫的兩個版本,使用斷言進行調試並使用無斷言進行優化。另外考慮在發佈版本中留下* cheap *斷言(如果它們不會影響性能,則測量!) – 2012-07-27 20:07:37

+0

@dribeas這是一個好主意(http://stackoverflow.com/questions/11695046/how-to-have-library-至少在unix平臺上,這似乎也是非標準的。這仍然存在這樣的問題,即如果沒有爲名稱添加特殊修飾符的庫應該是斷言的還是非斷言的。另外,如果用戶不要求兩個版本,默認情況下是否聲明爲斷言。我認爲斷言應該只針對那些要求他們的人,但這似乎與標準做法相悖,我想知道爲什麼。 – 2012-07-27 20:27:29

+0

@DavidRodríguez-dribeas哦,等等,我沒有注意到你說「調試斷言」。這個問題不是關於調試版本。這是關於從源代碼構建並執行諸如「make install」之類的默認發行版本。 – 2012-07-27 21:10:19

回答

0

我想我現在已經想通了。定義NDEBUG的問題是它可能導致未定義的行爲。我的模板庫有一些非模板部分,所以我的代碼被內聯到其他人的二進制文件中。如果我在編譯非內聯代碼時定義了NDEBUG,然後客戶端代碼被編譯爲沒有NDEBUG,那麼將會有兩個不兼容的頭部代碼版本 - 一個帶有斷言,一個帶有斷言,一個沒有。這導致了未定義的行爲,並且在我之前我曾經遇到過這個神祕的崩潰問題。所以我不認爲圖書館應該定義NDEBUG - 負責編譯給定計算機上的所有內容的人或構建系統應該是決定NDEBUG的人。

但是,我不需要定義NDEBUG,只是爲了讓我的庫默認運行時沒有斷言。我現在有一個宏MYLIB_DEBUG和MYLIB_ASSERT。如果未定義MYLIB_DEBUG,則MYLIB_ASSERT(X)將不執行任何操作。如果定義了MYLIB_DEBUG,那麼MYLIB_ASSERT(X)被定義爲斷言(X)。這使得選擇加入而不會搞亂NDEBUG。

所以我當前對我的問題的答案是,默認情況下庫關閉斷言是好的,只是不要通過定義NDEBUG來實現,如果你的接口有任何包含斷言的內聯函數。

0

如果斷言的使用會讓您的圖書館變得很慢,並按照您的要求關閉它。確保它清楚地記錄在案並不再擔心。

相關問題