4

MuPDF でデバッグ オプションを有効にしようとしています。何らかの理由で、私が使用したいコードが使用され#ifndef NDEBUG、グレー表示されています。#endifライブラリ全体を検索しましたが、どこにも定義された NDEBUG の痕跡は見つかりませんでした。ヘッダーを追加することでこれを回避できました#undef NDEBUGが、より非侵入的な方法があるかどうかを知りたいです。

SO、メイクファイルから「#ifndef/#endif」ブロックを有効にできますか?

また、なぜ#ifndefコードをグレーアウトするのですか? あるはずじゃない#ifdef NDEBUG

4

2 に答える 2

10

Makefileの次の3つの変数(CFLAGSCPPFLAGS、およびCXXFLAGS )に-DNDEBUGを追加して、NDEBUGを定義できます。これは、#defineNDEBUGを追加するのと同じです

他のバリエーションもあります:

-DNBDEBUG=1

と同等です

#define NDEBUG 1

そして、なぜ誰かが#ifdefの代わりに#ifndefを使用するのかという質問に答えるのは、元のコードへの変更が非常に明確に強調されているためです。

たとえば、次のコードを元のバージョンと見なします。

int a = 123;
int b = 346;
int c = a + b;

そして、代わりに乗算するマクロDO_MULTを追加する必要があります。これを行うには2つの方法があります。

最初のバリエーション:

int a = 123;
int b = 346;
#ifdef DO_MULT
int c = a *b;
#else
int c = a + b;
#endif

2番目のバリエーション:

int a = 123;
int b = 346;
#ifndef DO_MULT
int c = a + b;
#else
int c = a *b;
#endif

difftoolsを使用して変更を確認する場合、2番目のバリエーションは最初のバリエーションと比較してdiffをより明確に表示します。

#ifndefを使用するもう1つの理由は、CATCH-ALL-EXCEPTシナリオで何かを行うためです。

于 2012-07-19T20:08:33.607 に答える
3

#ifndef フラグが定義されている場合はコードを省略しないため、使用法です。を使用してコードを含めることができました#undef

正当化がこの不自然な例を検討するので、#ifdefとの両方が役立ちます。条件を使用して、デバッグビルドにコンパイルするだけのデバッグコードがたくさんあります。同じ実行可能ファイルには、デバッグビルドから除外したいコードもあります。この場合、使用することが唯一の選択肢です。#ifndefprintf#ifdef DEBUG#ifndef DEBUG

このようなフラグはmakefileで定義でき-Uます。また、を使用して以前の定義を削除することもできます。CFLAGSmakefileで変数を探して追加-UNDEBUGするか、コンパイルターゲットのコンパイラ呼び出しに直接追加します。

フラグソースツリーのどこかで定義されている場合、これは役に立ちません。

于 2012-07-19T20:08:59.520 に答える