web-dev-qa-db-ja.com

C ++は、プリプロセッサシンボルを定義せずにデバッグシンボルでコンパイルするかどうかを決定します

私はこのようなものを使用しています:

int main(int argc, char *argv[])
{

#ifdef DEBUG
    printf("RUNNING DEBUG BUILD");
#else
    printf("Running... this is a release build.");
#endif
...

ただし、これには、デバッグビルドのために-DDEBUGを指​​定してコンパイルする必要があります。 GCCは、チェックできる独自のプリプロセッサマクロを定義するなど、デバッグシンボル(-gフラグ)を使用してコンパイルするタイミングを判断する方法を提供しますか?

27
Steven Lu

答えはノーです。通常、これらのマクロ(DEBUG、NDEBUG、_DEBUG)は、アクティブな構成(デバッグ/リリース)に応じて、IDE/makeシステムによって設定されます。私はこれらの答えが助けになると思います:

C#デバッグ印刷用のマクロを定義

-DNDEBUGは通常どこから来るのですか?

_ DEBUG vs NDEBUG

23
JoeSlav

私が探していた答えは、本質的にはAdamがコメントとして投稿したものだと思います。

コンパイラーの仕事には前処理は含まれていません。実際、コンパイラーは、プリプロセッサーが処理していないプリプロセッサースイッチをコード化します。

したがって、コードを分岐する方法はプリプロセッサを利用する必要があるため、コンパイラgetsがすでにどちらかであるすべてのコード(デバッグコードまたはリリースコード)を意味するため、私には不可能です私の質問がこの段階で行うことを実行する(プリプロセッサの後)。

したがって、プリプロセッサがコードをフィードするための独立したプロセスとして設計されていることが直接の結果です。

0
Steven Lu