C++ 调试帮助简介
Source: C++ primer(version 5)
主要思想是:程序所包含的調(diào)試代碼僅在開發(fā)過程中執(zhí)行。當(dāng)應(yīng)用程序已經(jīng)完成,并且準(zhǔn)備提交時(shí),就會(huì)將調(diào)試代碼關(guān)閉。這種方法會(huì)用到兩項(xiàng)預(yù)處理功能:assert 和NDEBUG。
assert預(yù)處理宏
定義在<cassert>頭文件中
的所謂預(yù)處理宏其實(shí)是一個(gè)預(yù)處理變量,它的行為有點(diǎn)類似于內(nèi)聯(lián)函數(shù)。使用一個(gè)表達(dá)式作為它的條件:
assert(expr);
只要NDEBUG未定義,assert宏就求解條件表達(dá)式expr,如果結(jié)果為false,assert輸出信息并且終止程序的執(zhí)行。如果該表達(dá)式有一個(gè)非零(例如:true)值,則assert不做任何操作。
NDEBUG預(yù)處理變量
assert的行為依賴于一個(gè)名為NDEBUG的預(yù)處理變量的狀態(tài)。如果定義了NDEBUG,則assert什么都不做。
使用:g++ -D NDEBUG -o test test_console.cpp
這條命令的作用等價(jià)于在main.c文件的一開始寫#define NDEBUG
使用:
可用NDEBUG預(yù)處理變量實(shí)現(xiàn)有條件的調(diào)試代碼:
int main( void ) { #ifndef NDEBUGcerr << “starting main” << endl; #endif //... }- 如果NDEBUG未定義,那么程序就會(huì)將信息寫道cerr中,如果NDEBUG已經(jīng)定義了,那么程序執(zhí)行時(shí)將會(huì)跳過#ifndef和#endif之間的代碼。
五種在調(diào)試時(shí)非常有用的常量
預(yù)處理器還定義了其余五種常有用的常量:
- _?FILE?_ 文件名
- _?LINE?_ 當(dāng)前行號(hào)
- _?TIME?_ 文件被編譯的時(shí)間
- _?DATE?_ 文件被編譯的日期
- _?func?_ 函數(shù)的名字
例子:
// 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; }執(zhí)行:
g++ -D NDEBUG -o test test_console.cpp -std=c++11 ./test safd輸出:
argc = 2 Error: test_console.cpp :in funciton main at line 13Compiled on Nov 9 2017 at 14:55:45 ./test safd總結(jié)
以上是生活随笔為你收集整理的C++ 调试帮助简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: `constexpr`和`const`之
- 下一篇: 局部静态变量Static详解