C/C++デバッグテクニック

1535 ワード

C/C++デバッグテクニック
from my csdn blog
マクロのデバッグassert()
パラメータは、断言が真である式であり、断言が真でない場合は、断言が何であり、プログラムが終了するかを示すエラーメッセージが発行されます.
#include 
#include 

using namespace std;

int main(){

    int i = 100;
    assert(i != 100);
    cout << i << endl;

    return 0;
}
amrzs@ubuntu:cc$ g++ main.cpp
amrzs@ubuntu:cc$ ./a.out 
a.out: main.cpp:11: int main(): Assertion `i != 100' failed.
    (     ) 

マクロコードの消去#includeの前に#define NDEBUGを挿入
あるいはコンパイラコマンドラインでndebugを定義し、マクロによって生成されたコードを除去することができます.
#include 

#define NDEBUG
#include 

using namespace std;

int main(){

    int i = 100;
    assert(i != 100);
    cout << i << endl;

    return 0;
}
amrzs@ubuntu:cc$ g++ main.cpp
amrzs@ubuntu:cc$ ./a.out 
100

変数文字列変換マクロ
変数と式を文字列に変換
プリプロセッサのマクロのパラメータの前に#を使用すると、プリプロセッサはこのパラメータを文字配列に変換します.#define P(A) cout << #A << ": " << (A) << endl;
デバッグしたくない場合、定義されたP(A)が機能しないように#ifdefを挿入することもできる.
デバッグタグ:プリプロセッサデバッグタグとランタイムデバッグタグ
よく使われるタグ名はDEBUG(NDEBUGは使用できませんが、Cの保留字です)
#define DEBUG
//...
#ifdef DEBUG 
//...debugging code 
#endif // DEBUG

C/C++は、コンパイラのコマンドラインに#defineおよび#undefタグを使用することも可能であり、コードを個別のコマンドで再コンパイルしてデバッグ情報を挿入することも可能である