web-dev-qa-db-ja.com

-gが指定されている場合、gccは何かを定義しますか?

まもなく、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の共通オプションは私の定義も削除します。それでも、デバッグモードでヘッダーを取得したくない場合は、定義するように指示する必要があります。

47
Shahbaz

あなたはそのようなフラグの任意の組み合わせに対して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フラグの追加の定義はありません。

35

他の人が言ったように、そして マニュアル から明らかなように、GCCはデバッグ情報が生成されるかどうかを示す組み込みマクロを提供しません(-gモード)。私が付け加えたいのは、これは意図的なものであるということです。

ずっと昔、GCCの元々の作者(RMS、ケナー、おそらく他の2人)は、デバッグ情報を有効にすることで何も変更しないバグのリスクを減らすための実際のコード デバッグしようとすると、不可解に消えてしまう 。これはGCCの基盤となる設計原則であり、今日でも開発者たちはそれを維持するために道を外れています。

マクロを定義すると、-gに応じてソースコードが変更されるため、この設計原則に違反します。

17
zwol

ランニング
g++ -E -dD -xc++ /dev/null
対.
g++ -E -dD -g -xc++ /dev/null
追加の定義されたシンボルは表示されません。

これは、シンボルが定義されることを示すドキュメントがないことと合わせて、何も定義されないことを安全に述べるのに十分なはずです。

11
Polynomial