C 程式設計除錯

2021-09-26 15:02:50 字數 2091 閱讀 6266

c++程式設計師有時會用到一種類似於標頭檔案保護的技術,以便有選擇地執行除錯**。基本思想是,程式可以包含一些用於除錯的**,但是這些**只在開發程式時使用。當應用程式編寫完成準備發布時,要先遮蔽掉除錯**。這種方式用到兩項預處理功能:assertndebug

assert 是一種預處理巨集(preprocessor marco)。所謂預處理巨集其實是乙個預處理變數。assert巨集使用乙個表示式作為它的條件:

assert(expr);
首先對expr求值,如果表示式為假(0),assert輸出資訊並終止程式的執行。如果表示式為真(非0),assert什麼也不做。

assert巨集定義在cassert標頭檔案中。如我們所知,預處理名字由預處理器而非編譯器管理,因此我們可以直接使用預處理名字而無須提供using宣告。也就是說,我們應該直接使用assert而不是std::assert,也不需要為assert提供using宣告。

#include #include #include using namespace std;

const int threshold = 10;

int chickstring(string str)

int main()

int main()

{ string str = "sjkd";

cout << chickstring(str) 《這樣的話,還是會執行assert巨集檢查,因為在ndebug關閉之前已經提前檢查過了。

所以,ndebug應該在assert標頭檔案前定義

#include #define ndebug;

#include #include //......

例如:

void print(const int ia,size_t size)

{ #ifndef ndebug

//__func__是編譯器定義的乙個區域性靜態變數,用於存放函式的名字

cerr << __func__<< ":array size is " << size 《其中 #ifndef 與 #ifdef 指令用來檢查某個預處理變數是否定義,一旦為真,將執行後續操作直到遇到 #endif 指令為止。若檢查結果為假,則編譯器將忽略 #ifdef 到 #endif 之間的部分。而預處理變數的定義則是靠#define指令來實現的。

在這段**中,使用變數__func__輸出當前除錯的函式名字,編譯器為每個函式都定義了__func__,它是const char的乙個靜態陣列,用於存放函式的名字。

除了__func__之外,預處理器還定義了另外4個對於程式除錯很有用的名字:

file:存放檔名的字串字面值;

line:存放當前行號的整型字面值;

time:存放檔案編譯時間的字串字面值;

date:存放檔案編譯日期的字串字面值。

可以使用這些常量在錯誤訊息中提供更多資訊,從而實現編寫自己的條件**

#include //#define ndebug;

#include #include using namespace std;

const int threshold = 10;

void chickstring(string str)

{ if(str.size() > threshold)

cerr<<"error: "<<__file__

<<" : in function "<<__func__

<<" at line "<<__line__《輸出error資訊:

error: d:\workspaces\tang_cprj\just\tdebug\main.cpp : in function chickstring at

line 19

compile on apr 21 2015 at 16:10:47

word read was 「sjkdsadasdasd」:length too short

參考文章

《C 程式設計除錯秘笈》導讀

c 程式設計除錯秘笈 敏銳的讀者可能會根據本書的英文書名 safe c 推斷出c 程式語言多少是有點兒不安全的。這確實是很靈敏的感覺!並且非常正確。c 語言可能導致程式設計師出現所有型別的錯誤,例如訪問乙個動態分配的陣列邊界之外的記憶體,或者從那些從未初始化過的記憶體進行讀取,或者分配了記憶體但忘了...

c 程式設計中的除錯技巧 C 程式設計思想

1.除錯標記 適用預處理 define定義乙個或多個除錯標記,在 中把除錯部分使用 ifdef 和 endif 進行管理。當程式最終除錯完成後,只需要使用 undef標記,除錯 就會消失。常用的除錯標記為debug,語句序列 define debug ifdef debug 除錯 endif 2.執...

C 程式設計 83 非中斷除錯

debug除錯 release發布 pdb檔案 程式資料庫檔案program database file vshost.exe檔案 宿主程序檔案vs host process vshost.exe.manifest檔案 xml檔案 release版本中不生成pdb和vshost檔案的方法 引入命名空...