2011-03-18 51 views
52

我有我的代碼充滿電話assert(condition)。 在調試版本中,我使用g++ -g開發我的斷言。 令我驚訝的是,我可以看到assertion在我的發行版中也可以正常工作,編譯時沒有-g選項。如何完全禁用聲明

如何在編譯時完全禁用我的斷言?我應該在我生成的任何版本中明確定義NDEBUG,儘管它們是調試,發佈或任何其他任何內容?

+1

有點偏題:如果你想調試信息,'-g'等價於'-g2'。 '-g3'可能是一個更好的選擇,因爲它提供了最具象徵意義的信息。例如,在'-g3',符號#defines將可用。不過,我似乎在'-g3'上看到了一些工具鏈。另外,許多外部庫也依賴於'-DDEBUG'進行'調試'構建(Posix僅爲「發佈」構建提供'-DNDEBUG')。 – jww 2012-09-04 17:32:37

回答

74

必須#define NDEBUG只要它包含斷言頭文件之前定義(或使用該標誌-DNDEBUG克++),這將禁用斷言。

+0

必須在'#include '之前? – 2017-03-30 02:53:23

9

您可以禁用斷言完全

#define NDEBUG 
#include <assert.h> 

,或者你可以在你的Makefile中設置了NDEBUG(通過-DNDEBUG)/建造取決於是否希望生產或開發人員版程序。

3

是的,在命令行/構建系統上使用預處理器/編譯器選項-DNDEBUG定義NDEBUG

這與-g插入的調試信息無關。

9

-g標誌不影響assert的操作,它只是確保各種調試符號可用。

設置NDEBUG是禁用斷言的標準(如官方ISO標準)。

30

使用#define NDEBUG

7.2診斷

1所述的標頭解音響未列名的斷言宏並且是指另一個宏,

NDEBUG

這是不德音響定義通過<assert.h>。 如果NDEBUG是德連接在被包括其中在源網絡文件的點定義爲一個宏名稱,斷言宏是德音響定義 簡稱爲

#define assert(ignore) ((void)0)

根據該斷言宏忠告音響定義當前狀態爲NDEBUG每次包含 <assert.h>

+1

嗨!如果在定義-DNDEBUG的時候確實是這樣,那麼assert的調用仍然會執行一些操作,即((void)0),這是否會花費最少的CPU週期?我認爲這是簡單地映射到什麼都沒有,即完全沒有代碼..是這樣嗎? – 2011-03-18 16:07:50

+0

@Abruzzo:直到現在我還這麼認爲,但再次考慮,這會留下一個空的';',例如,如果'assert'在'if'內部,這可能會有問題。我確信編譯器會優化類似'0;'離開 – davka 2011-03-18 16:17:14

+0

@Abruzzo和BTW的行,檢查您的IDE或構建系統是否允許爲新項目指定默認模板。然後,您可以在每個新項目的發佈配置中定義NDEBUG – davka 2011-03-18 16:20:41