C++ 調試幫助簡介
Source: C++ primer(version 5)
主要思想是:程序所包含的調試代碼僅在開發過程中執行。當應用程序已經完成,並且準備提交時,就會將調試代碼關閉。這種方法會用到兩項預處理功能:assert 和NDEBUG。
assert預處理宏
定義在<cassert>
頭文件中
的所謂預處理宏其實是一個預處理變量,它的行爲有點類似於內聯函數。使用一個表達式作爲它的條件:
assert(expr);
只要NDEBUG未定義,assert宏就求解條件表達式expr,如果結果爲false,assert輸出信息並且終止程序的執行。如果該表達式有一個非零(例如:true)值,則assert不做任何操作。
NDEBUG預處理變量
assert的行爲依賴於一個名爲NDEBUG的預處理變量的狀態。如果定義了NDEBUG,則assert什麼都不做。
使用:g++ -D NDEBUG -o test test_console.cpp
這條命令的作用等價於在main.c文件的一開始寫#define NDEBUG
使用:
可用NDEBUG預處理變量實現有條件的調試代碼:
int main( void )
{
#ifndef NDEBUG
cerr << “starting main” << endl;
#endif
//...
}
如果NDEBUG未定義,那麼程序就會將信息寫道cerr中,如果NDEBUG已經定義了,那麼程序執行時將會跳過#ifndef和#endif之間的代碼。
五種在調試時非常有用的常量
預處理器還定義了其餘五種常有用的常量:
- _ FILE _ 文件名
- _ LINE _ 當前行號
- _ TIME _ 文件被編譯的時間
- _ DATE _ 文件被編譯的日期
- _ func _ 函數的名字
例子:
// test_console.cpp
#include <iostream>
#include <cstddef>
#include <cassert>
using namespace std;
int main (int argc, char** argv){
cout<<"argc = "<<argc<<endl;
//assert(argc<3);
if(argc<3)
cout<<"Error: "<<__FILE__
<<" :in funciton "<<__func__
<<" at line "<<__LINE__<<endl
<<" Compiled on "<<__DATE__
<<" at "<<__TIME__<<endl;
for(size_t i=0;i<argc;i++){
cout<<argv[i]<<endl;
}
return 0;
}
執行:
g++ -D NDEBUG -o test test_console.cpp -std=c++11
./test safd
輸出:
argc = 2
Error: test_console.cpp :in funciton main at line 13
Compiled on Nov 9 2017 at 14:55:45
./test
safd