C/C++デバッグテクニック
1535 ワード
C/C++デバッグテクニック
from my csdn blog
マクロのデバッグ
パラメータは、断言が真である式であり、断言が真でない場合は、断言が何であり、プログラムが終了するかを示すエラーメッセージが発行されます.
マクロコードの消去
あるいはコンパイラコマンドラインでndebugを定義し、マクロによって生成されたコードを除去することができます.
変数文字列変換マクロ
変数と式を文字列に変換
プリプロセッサのマクロのパラメータの前に#を使用すると、プリプロセッサはこのパラメータを文字配列に変換します.
デバッグしたくない場合、定義されたP(A)が機能しないように
デバッグタグ:プリプロセッサデバッグタグとランタイムデバッグタグ
よく使われるタグ名はDEBUG(NDEBUGは使用できませんが、Cの保留字です)
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
タグを使用することも可能であり、コードを個別のコマンドで再コンパイルしてデバッグ情報を挿入することも可能である