C++ 調試幫助簡介

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章