まもなく、gcc(またはg ++。[〜#〜] c [〜#〜]で必要ですが、c ++にも興味がある)が-g
有効になっています。そうですか?もしそうなら、どんな記号ですか?
検索プロセスで、次のことがわかりました。
_DEBUG
は手動で定義され(手動で-D_DEBUG
を意味します)、Visual Cプログラマーから取られた習慣です(VCがデバッグでコンパイルするときに_DEBUG
を定義するため)モード)NDEBUG
は、デバッグモードでない場合に定義されます。私はこれを言っている場所をいくつか見つけましたが、.cファイルと.cppファイルでgccとg ++を試しましたが、-g
の有無にかかわらず、そのような記号は定義されていませんでした。編集:非標準の記号を使用したくない理由を説明します。
何かを実行し、他のカーネルモジュールに含まれるヘッダーファイルを提供して、このモジュールに接続できるカーネルモジュールを想像してください。
ファシリティとして、私が持っているヘッダーファイルの1つに:
#ifdef DEBUG <-- This is what I need
#define LOG(x, ...) printk("Some extra info"x, ##__VA_ARGS__);
#else
#define LOG(x, ...) printk("Without extra info"x, ##__VA_ARGS__);
#endif
名前は実際にはLOG
ではないことに注意してください。これは例です。
今、私はDEBUG
に任意の記号を使用できますが、誰かが私のヘッダーを含む場合、その記号を定義しない可能性があります。もちろん、「ちなみに、デバッグモードでヘッダーを取得するには、この別のシンボルを定義する」と伝えることはできますが、それは私には正しく聞こえません。
ヘッダーでシンボルを定義し、すべてのヘッダーファイルに含めることができます。このように、ヘッダーに私のヘッダーが含まれていると、デバッグシンボルも取得されます。ここでの問題は、それらがしないデバッグモードでコンパイルしたい場合、私のヘッダーはまだそれらがデバッグモードにあると見なしていることです。
したがって、-g
が使用されている場合に定義されている記号がある場合、それを使用するのが最善だと思いました。
これまでのところ、私は次のようなことができるという結論に達しました。
how_to_build.h
#if !defined(NDEBUG)
#define MY_DEBUG
#endif
使用法:
#include "how_to_build.h"
#ifdef MY_DEBUG
// rest of the story
このように、NDEBUG
の共通オプションは私の定義も削除します。それでも、デバッグモードでヘッダーを取得したくない場合は、定義するように指示する必要があります。
あなたはそのようなフラグの任意の組み合わせに対してgcc/g ++が定義するすべてのマクロのリストを見ることができます:
$ g++ -E -dD -xc++ /dev/null
例えば:
[max@truth ~]$ g++ -E -dD -xc++ /dev/null > a
[max@truth ~]$ g++ -E -dD -xc++ -g -O3 /dev/null > b
[max@truth ~]$ diff a b
1a2
> # 1 "/home/max//"
173c174
< #define __NO_INLINE__ 1
---
> #define __OPTIMIZE__ 1
-g
が何かを定義しているかどうか見てみましょう:
[max@truth ~]$ g++ -E -dD -xc++ -g /dev/null > c
[max@truth ~]$ diff a c
1a2
> # 1 "/home/max//"
追加のプリプロセッサディレクティブですが、-g
フラグの追加の定義はありません。
他の人が言ったように、そして マニュアル から明らかなように、GCCはデバッグ情報が生成されるかどうかを示す組み込みマクロを提供しません(-g
モード)。私が付け加えたいのは、これは意図的なものであるということです。
ずっと昔、GCCの元々の作者(RMS、ケナー、おそらく他の2人)は、デバッグ情報を有効にすることで何も変更しないバグのリスクを減らすための実際のコード デバッグしようとすると、不可解に消えてしまう 。これはGCCの基盤となる設計原則であり、今日でも開発者たちはそれを維持するために道を外れています。
マクロを定義すると、-g
に応じてソースコードが変更されるため、この設計原則に違反します。
ランニングg++ -E -dD -xc++ /dev/null
対.g++ -E -dD -g -xc++ /dev/null
追加の定義されたシンボルは表示されません。
これは、シンボルが定義されることを示すドキュメントがないことと合わせて、何も定義されないことを安全に述べるのに十分なはずです。