(37)除錯幫助

2021-07-24 22:25:41 字數 1071 閱讀 6673

c++程式設計師有時會用到一種類似於標頭檔案保護的技術,以便有選擇地執行除錯**。程式可以包含一些用於除錯的**,但這些**

只在開發程式時使用。當應用程式編寫完成準備發布時,要先遮蔽掉除錯**。這種方法用到兩種預處理功能:assert和ndebug。

assert是一種預處理巨集。所謂預處理巨集其實是乙個預處理變數,它的行為有點類似於內聯函式。assert巨集使用乙個表示式作為它的

條件:assert(expr);

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

assert巨集定義在cassert標頭檔案中,預處理名字由預處理器而非編譯器管理,因此我們可以直接使用預處理名字而無需提供using宣告。

和預處理變數一樣,巨集名字在程式內必須唯一。含有cassert標頭檔案的程式不能再定義名為assert的變數、函式或者其他實體。

assert巨集常用於檢查「不能發生」的條件。如:乙個對輸入文字進行操作的程式可能要求所有給定單詞的長度都大於某個閥值,

assert(word.size()>threshold);

assert的行為依賴於乙個名為ndebug的預處理變數的狀態。如果定義了nedbug,則assert什麼也不做。預設狀態下沒有定ndebug,此時assert將執行執行時檢查。

如果ndebug未定義,將執行#ifndef和#endif之間的**,如果定義了ndebug,這些**將被忽略掉:

void print(const int ia,size_t size)
在這段**中,我們使用變數_ _func_ _輸出當前除錯的函式的名字。編譯器為每個函式都定義了_ _func_ _,它是const char的一

個靜態陣列,用於存放函式的名字。

除了c++編譯器定義的_ _func_ _之外,預處理器還定義了另外4個對於程式除錯很有用的名字:

_ _file_ _存放檔名的字串字面值 

_ _line_ _ 存放當前行號的整型字面值

_ _time_ _ 存放檔案編譯時間的字串字面值

_ _date_ _ 存放檔案編譯日期的字串字面值

C 除錯幫助簡介

主要思想是 程式所包含的除錯 僅在開發過程中執行。當應用程式已經完成,並且準備提交時,就會將除錯 關閉。這種方法會用到兩項預處理功能 assert 和ndebug。定義在標頭檔案中 的所謂預處理巨集其實是乙個預處理變數,它的行為有點類似於內聯函式。使用乙個表示式作為它的條件 assert expr ...

PHP xdebug 幫助除錯php 程式

以下步驟為使用source 包去安裝xdebug軟體包。tar xzf xdebug 2.1.0.tgz cd xdebug 2.1.0 phpize configure enable xdebug 如果提示找不到php config 則請用以下命令編譯 configure enable xdebu...

自己編寫ASSERT 巨集(對除錯程式很有幫助)

程式 include using namespace std define debug ifndef debug define assert x else define assert x if x endif int main int x 999 cout 第一次執行assert 說明 1 asse...