[英]The #define NDEBUG doesn't seem to work
我在文中讀到放置以下預處理器行忽略所有后續的斷言預處理器指令。 但這似乎不起作用,並且assert語句infact由預處理器處理,並且當斷言中的條件不滿足時中止程序(我知道在不滿足斷言條件時abort是正確的行為)。 我的問題是為什么放置#define NDEBUG不會忽略斷言語句。 代碼是
#include<stdio.h>
#include<assert.h>
#define NDEBUG
int main(){
int x = 0;
assert (x!=0);
}
改變外觀的順序,它應該工作:
#define NDEBUG
#include<assert.h>
NDEBUG
用於有條件地在<assert.h>
定義assert()
宏。
定義不會像這樣工作。 你應該在包含assert.h 之前定義你的NDEBUG
發生這種情況是因為在assert.h
使用#ifdef
檢查了NDEBUG:
#ifdef NDEBUG
# define assert(expr) (__ASSERT_VOID_CAST (0))
#else
//....
NDEBUG
必須在包含標頭之前出現。 這在標准中有詳細說明。
頭定義了
assert
和static_assert
宏並引用了另一個宏,NDEBUG
它不是由
<assert.h>
定義的如果NDEBUG被定義為源文件中包含<assert.h>
的點的宏名稱,則斷言宏被簡單地定義為#define assert(ignore) ((void)0)**
斷言宏根據每次包含的NDEBUG的當前狀態重新定義。
來自N1570,強調我的。
之前的所有答案都是正確的
但是,斷言並不意味着在源代碼中添加#define NDEBUG
。
規范方式:
1)使用#include <assert.h>
並在代碼中調用assert()
。
2)然后在構建時:
2a) gcc blablabla
:這是一個調試版本,沒有定義NDEBUG,並且assert()付諸行動。
2b) gcc blablabla -DNDEBUG blablabla
:這是一個生產版本,定義了NDEBUG,assert()什么都不做。
斷言是一種在開發時發現錯誤/異常情況的方法。 NDEBUG可以拼寫為“NOT_DEBUG”。
另一種方法,在CMakeLists.txt中添加定義聽起來不錯。
set(release 1)
if (release)
add_definitions(-DNDEBUG)
endif ()
如果你調試就set(release 0)
,並在發布時set(release 1)
它更方便,更易讀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.