make ファイルからプログラムをデバッグする方法を設定する必要があります。具体的には、入力するときにmake -B FLAG=-DNDEBUG
プログラムを正常に実行する必要があります。しかし、このフラグが存在しない場合assert()
、コード全体でいくつかのコマンドを実行する必要があります。
明確にするために、このフラグが私の C コード内に存在しないかどうかを確認する方法を知る必要が#ifndef
あります。
私の無知を許してください、どんな反応でも大歓迎です!
make ファイルからプログラムをデバッグする方法を設定する必要があります。具体的には、入力するときにmake -B FLAG=-DNDEBUG
プログラムを正常に実行する必要があります。しかし、このフラグが存在しない場合assert()
、コード全体でいくつかのコマンドを実行する必要があります。
明確にするために、このフラグが私の C コード内に存在しないかどうかを確認する方法を知る必要が#ifndef
あります。
私の無知を許してください、どんな反応でも大歓迎です!
"FLAG=-DNDEBUG" を指定してまたは指定せずに make を呼び出す場合、Makefile に次のような規則が必要になります。
%.o: %.c
gcc -c $(FLAG) $<
C コードでは、次のようなものが必要になります。
#ifndef NDEBUG
fprintf(stderr, "My trace message\n");
#endif
標準ライブラリ ( d in ) のassert
マクロについて話していると仮定すると、何もする必要はありません。ライブラリはすでにフラグを処理しています。#define
<assert.h>
NDEBUG
マクロが / ではない場合にのみ独自のコードを実行させたい場合は、質問ですでに疑っている#define
ように an を使用してください。#ifdef
たとえば、条件が複雑すぎて 1 つのassert
式にまとめられない場合があるため、変数が必要です。しかし、assert
が何も展開されない場合、その値を計算する必要はありません。したがって、このようなものを使用できます。
int
questionable(const int * numbers, size_t length)
{
#ifndef NDEBUG
/* Assert that the numbers are not all the same. */
int min = INT_MAX;
int max = INT_MIN;
size_t i;
for (i = 0; i < length; ++i)
{
if (numbers[i] < min)
min = numbers[i];
if (numbers[i] > max)
max = numbers[i];
}
assert(length >= 2);
assert(max > min);
#endif
/* Now do what you're supposed to do with the numbers... */
return 0;
}
このコーディング スタイルはコードを読みにくくし、デバッグが非常に困難なHeisenbugsを要求していることに注意してください。これを表現するより良い方法は、関数を使用することです。
/* 1st helper function */
static int
minimum(const int * numbers, size_t length)
{
int min = INT_MAX;
size_t i;
for (i = 0; i < length; ++i)
{
if (numbers[i] < min)
min = numbers[i];
}
return min;
}
/* 2nd helper function */
static int
maximum(const int * numbers, size_t length)
{
int max = INT_MIN;
size_t i;
for (i = 0; i < length; ++i)
{
if (numbers[i] > max)
max = numbers[i];
}
return max;
}
/* your actual function */
int
better(const int * numbers, int length)
{
/* no nasty `#ifdef`s */
assert(length >= 2);
assert(minimum(numbers, length) < maximum(numbers, length));
/* Now do what you're supposed to do with the numbers... */
return 0;
}