我有我的代碼充滿電話assert(condition)
。 在調試版本中,我使用g++ -g
開發我的斷言。 令我驚訝的是,我可以看到assertion在我的發行版中也可以正常工作,編譯時沒有-g
選項。如何完全禁用聲明
如何在編譯時完全禁用我的斷言?我應該在我生成的任何版本中明確定義NDEBUG
,儘管它們是調試,發佈或任何其他任何內容?
我有我的代碼充滿電話assert(condition)
。 在調試版本中,我使用g++ -g
開發我的斷言。 令我驚訝的是,我可以看到assertion在我的發行版中也可以正常工作,編譯時沒有-g
選項。如何完全禁用聲明
如何在編譯時完全禁用我的斷言?我應該在我生成的任何版本中明確定義NDEBUG
,儘管它們是調試,發佈或任何其他任何內容?
必須#define NDEBUG
只要它包含斷言頭文件之前定義(或使用該標誌-DNDEBUG
與克++),這將禁用斷言。
必須在'#include
您可以禁用斷言完全
#define NDEBUG
#include <assert.h>
,或者你可以在你的Makefile中設置了NDEBUG(通過-DNDEBUG)/建造取決於是否希望生產或開發人員版程序。
是的,在命令行/構建系統上使用預處理器/編譯器選項-DNDEBUG
定義NDEBUG
。
這與-g
插入的調試信息無關。
-g
標誌不影響assert
的操作,它只是確保各種調試符號可用。
設置NDEBUG
是禁用斷言的標準(如官方ISO標準)。
使用#define NDEBUG
7.2診斷
1所述的標頭解音響未列名的斷言宏並且是指另一個宏,
NDEBUG
這是不德音響定義通過
<assert.h>
。 如果NDEBUG是德連接在被包括其中在源網絡文件的點定義爲一個宏名稱,斷言宏是德音響定義 簡稱爲
#define assert(ignore) ((void)0)
根據該斷言宏忠告音響定義當前狀態爲NDEBUG每次包含
<assert.h>
。
嗨!如果在定義-DNDEBUG的時候確實是這樣,那麼assert的調用仍然會執行一些操作,即((void)0),這是否會花費最少的CPU週期?我認爲這是簡單地映射到什麼都沒有,即完全沒有代碼..是這樣嗎? – 2011-03-18 16:07:50
@Abruzzo:直到現在我還這麼認爲,但再次考慮,這會留下一個空的';',例如,如果'assert'在'if'內部,這可能會有問題。我確信編譯器會優化類似'0;'離開 – davka 2011-03-18 16:17:14
@Abruzzo和BTW的行,檢查您的IDE或構建系統是否允許爲新項目指定默認模板。然後,您可以在每個新項目的發佈配置中定義NDEBUG – davka 2011-03-18 16:20:41
有點偏題:如果你想調試信息,'-g'等價於'-g2'。 '-g3'可能是一個更好的選擇,因爲它提供了最具象徵意義的信息。例如,在'-g3',符號#defines將可用。不過,我似乎在'-g3'上看到了一些工具鏈。另外,許多外部庫也依賴於'-DDEBUG'進行'調試'構建(Posix僅爲「發佈」構建提供'-DNDEBUG')。 – jww 2012-09-04 17:32:37