簡體   English   中英

#define NDEBUG似乎不起作用

[英]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必須在包含標頭之前出現。 這在標准中有詳細說明。

頭定義了assertstatic_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM