• 締切済み

#ifdef _DEBUGが効かない

こんにちは。 Win2000、VC++6.0使用。 今までC言語でプログラムを組んではいましたが、 #define _DEBUG #ifdef _DEBUG print(...); #endif というようにデバッグ用のコードを入れたことはありませんでした。 このような便利なものがあると知り、早速使ってみたのですが、 #define _DEBUG の一文をコメントアウトして、再コンパイル(リビルド) して実行してみたのですが、 普通に #ifdef _DEBUG #endif で囲まれた部分が実行されてしまいます。 #define _DEBUG を宣言しなければ、実行されないと思っていたのですが 自分の勘違いでしょうか? よくわかりません。 どなたかご存知の方、よろしくお願いします。

みんなの回答

  • _nob
  • ベストアンサー率0% (0/0)
回答No.6

自分も同じことをして悩んでたのですが、なんとなくわかったので書いておきます。 http://www.mnc.co.jp/intime/user/intimedev.php?INtime%20technical%20FAQ#content_1_67 ↑環境が異なるのでビンゴではないですが、 何かのコンパイラオプションが「_DEBUG」を暗黙に追加宣言してしまうようです。 「_DEBUG」以外でデバッグの切り分けをした方がいいみたいですね。

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.5

> 早速設定を見てみましたが、確かに > プリプロセッサの定義に_DEBUGというのがありました。 この際、左側のツリーで対象のソースファイルを選択しているか、確認してみてください。 ソースファイル全体(フォルダのアイコン)に対する変更だけでは反映されなかった気もします。 プロジェクトの設定の考え方は、makefileとか、コンパイル、リンクに関する知識とかがないと、わかりにくいかも。

回答No.4

#define _DEBUG を消して、 ビルドするときに、 ○○ - Win32 Release か ○○ - Win32 Debug を選択するのでは?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#は、プリプロセッサ命令で コメントは、言語の部分ですから、 コメントアウトできていないのじゃないでしょうか 一度、その行を削除してみるか #define _DEBUG の後で #undef _DEBUG を加えるとかやってみてはどうでしょう?

  • ysk6406
  • ベストアンサー率40% (237/589)
回答No.2

> 確かにプリプロセッサの定義に_DEBUGというのがありました。 それが分かっているのなら、何も _DEBUG に拘る必要などないと思いますが… #ifdef MYDEBUG とかでは、なぜダメなんでしょうか?

hiro-long
質問者

お礼

ご返答ありがとうございます。 おっしゃる通り、_DEBUG 以外でしたら 問題なく動作できました。 今回、_DEBUG ではなぜダメなのか、というのを 知りたかったので、この部分に固執したというのもあります。

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.1

[プロジェクト]-[設定] 「プロジェクトの設定」ダイアログ 「C/C++」タブ カテゴリ:全般 の、 プリプロセッサの定義: の中に「_DEBUG」が定義されていないか、確認してください。 ここに_DEBUGが定義されている場合、コンパイルする時に#defineされているものとして扱われます。 -- 通常、デバッグでないリリースモードでのコンパイルを行う場合、 [ビルド]-[アクティブな構成の変更] 「プロジェクトの標準構成」ダイアログ で、 ○○ - Win32 Release を選択します。 (または、[ビルド]ツールバーで切り替え可能。) 作成したプログラムの配布、数値計算を伴う実験の実施などはこちらのReleaseモードで作成した、小さくて速くてデバッグ用のライブラリを必要としないexeを利用します。

hiro-long
質問者

お礼

早速のご返答ありがとうございます。 早速設定を見てみましたが、確かに プリプロセッサの定義に_DEBUGというのがありました。 しかしながら、削除→リビルド→実行してみましたが 状況は変わりませんでした。 リリースモード用に再コンパイルして、実行してみましたが、 これまた同じように実行されてしまいます。 なんか、古い実行ファイルが残っているような 気がしないでもないのですが。。。 どれを消していいのかよくわかりませんでした。。。

関連するQ&A

  • #ifdef の使い方

    組み込み系のプログラムを現在勉強しています。 #ifdefについて質問させて頂きます。 下記コードの場合 #ifdef A ---- (1) Y = Z; #else -----#if B ------- (2) X = Z; ----#endif #endif ("-"は空白と思ってください。) この場合、Aが定義されていれば(1)が実行しコンパイル終了(#endif)。 Aが定義されていない場合、#else に行き、Bが定義されている場合は (2)を実行してコンパイル終了(#endif)という理解であっていますか? またこうした方が分かりやすいなど、アドバイス頂けると幸いです。 ご返答よろしくお願いします。

  • デバッグ中だけ、画面に出力したいときはどうすればいいでしょうか?

    デバッグ中だけ、画面に出力したいときはどうすればいいでしょうか? Visual Basic では debug.print("デバッグ中") といった関数が用意されていて、デバッグ中だけ動作できたのですが、java にもこういうのがないでしょうか? #ifdef DEBUG System.out.println("デバッグ中"); #endif などとすると、これだけで3行も場所を取りますし・・。

    • ベストアンサー
    • Java
  • #ifdefはどうやって使う?

    よろしくお願いします。 現在趣味でゲームを作っています。 普通の#ifdefの使い方は存じているのですが、以下のような場合どうすればいいのでしょうか。 ゲームにはイージーと、ノーマルで2種類のレベルが設定出来ます。 イージーの場合は、最初の定義から、ボスのショットである boss_shot1()関数は上のイージー用の関数を通ります。 ノーマル設定の場合、 #define EASYを注釈にすることで、ノーマルの設定のboss_shot1();を通ります。 #define EASY #ifdef EASY void boss_shot1(){   //イージー用のショット } #else void boss_shot1(){   //ノーマル用のショット } #endif しかしこれでは、プログラム内でレベル設定をする事が出来ません。 注釈にしてコンパイルしたものと、#define EASYをそのままにしてコンパイルしたもの、2つの実行ファイルで レベル分けをしないといけません。 うまくプログラム内でこの条件分岐が出来ないでしょうか? 内容の違う関数は関数名を変えて記述するしかないのでしょうか? よろしくお願いします。

  • コンパイル時のスイッチについて

    C言語初心者なので申し訳ありませんが,コンパイル時のスイッチについて困っております. 現在, #define tmp ... #ifdef tmp  関数1 #else  関数2 #endif とtmpを定義して切り替えようとしております. 現在コンパイルの切替は,毎回 //#define tmp とコメントアウトして切り替えているのですが, gcc等のコンパイラのコマンドラインから 切り替える方法はあるのでしょうか. 色々調べたら, cc -D tmp みたいな?感じにするのかと思ったのですがうまくいきません. 初歩の質問ですがご教授よろしくお願いします.

  • Javaでのデバッグコード削除

    Javaで条件分岐などによってコード自体を削除することはできるのでしょうか。 目的はデバッグコードの負荷軽減です。 C言語でいうところの、プリプロセッサのようなことができることが理想です。 例えば、メソッド中に以下のようなコードがあるとします。 ------------------------------------ final boolean DEBUG = true; if (DEBUG) System.out.println("Debug: hogehoge"); ------------------------------------ 上の場合はif文条件分岐の処理負荷が発生すると思います。 この程度であれば低負荷であることは認識していますが、どうも気持ちが悪いです。 例えば、C言語であれば以下のようにしてコンパイル時にコードごと削除することができると思います。 ------------------------------------- #define DEBUG int main(){ #ifdef DEBUG    printf("Debug: hogehoge"); #endif return 0; } ------------------------------------- Javaで上記のようなことを実現することは可能でしょうか。 デバッグコードの削除が目的ですので、仮にこれができなかったとしてもIDEやそのプラグインなどで目的が達せられれば問題ありません。 どなたか解決策をご存知であればご教示願います。

  • VC6.0のデバッグで1つ以上のブレイクポイントが

    VCのサンプルプログラムをデバッグしようとしています。 デバッグ開始を実行すると、exeにデバッグ情報がありません。と表示され、 その後、ひとつ以上のブレイクポイントが設定できませんでした。と表示されます。 プロジェクトの設定でWin32 DEBUGを設定 ビルドメニューのアクティブな構成もWin32 Debug を選択していて、リビルド、コンパイルしています。 別のプロジェクトだと、うまくいくのですが・・・ ブレイクポイントの設定位置も問題ないかと思うのですが、 どなたか、お心当たりございましたら、よろしくお願いします。

  • VC Debugモード

    Visual Stdio .NET 2003 環境のDebugモードについて質問があります。 開発言語は C++です。 今、コマンドライン引数を以下のように設定し、ファイルに保存された 情報を処理するプログラムを作成しています。 test1.exe 0 ./input.txt ↑ [実行ファイル名][検索したい文字][処理したいファイルへのパス] 上のように入力した場合、argcは[3]を返すと思うのですが、Debug モードでいざ実行してみると、値は「4」となっていました。 コマンドライン引数はVCの「プロジェクト」→「**のプロパティ」 →左ウィンドウの「デバッグ」→右ウィンドウの「コマンド引数」に 上のように設定しています。 また、Debugモードでargv[0]を調べたところ、実行ファイルまでのパス が保存されていました。 なぜ、このようになるのでしょうか? あと本題からそれるのですが、ソースの中でVCがDebugモードで動作していることを知る方法はないでしょうか? もし、Debugモードなのかどうかがわかるのであれば、ソースをDebug モード用とReleseモード用とに切り替えられるようにしたいのですが。。。 合わせてお教えください。

  • プリプロセッサ#ifdef~#endifについて

    C言語のプリプロセッサ#ifdef~#endifを使用して以下のソースファイルを作成しました。コンパイルするとエラーになります。 (pre.c)*********************** /* 各行の頭は行番号を表しています。*/ /* 実際のソースには記述していません。 */ 1: #include <stdio.h> 2: 3: #define TAB 0x61 4: #ifdef TAB 5: printf("%c", TAB); 6: #endif 7: 8: int main(void) { 9: return 0; 10: } ****************************** C:\>cl pre.c Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. pre.c pre.c(5) : error C2143: 構文エラー : ')' が '文字列' の前にありません。 pre.c(5) : error C2143: 構文エラー : '{' が '文字列' の前にありません。 pre.c(5) : error C2059: 構文エラー : '<不明>' pre.c(5) : error C2059: 構文エラー : ')' 原因について、どなたか教えて頂けませんでしょうか?

  • リビルド後に実行しようとするとビルド要求のメッセージが出る

    VC++6.0のMFCを使って開発しているアプリケーションがあります。そのアプリケーションをビルドする際に起きる問題についてです。 リビルドした後に実行ファイルを実行しようとすると「ビルドしますか?」というメッセージが出てきます。リビルドしたばかりなのに何故ビルドが必要なのかわかりません。それから、再ビルド時には全ソースファイルがコンパイルされているようですので、実行されるまで時間がかかってしまいます。 リビルドしたときにはコンパイルエラーや警告はありませんし、リビルド後には確かに実行ファイルは生成されています。「ビルドしますか?」のメッセージが出ても「はい」ボタンをクリックしてビルドが完了すれば実行ファイルが実行されます。この問題は開発当初からあった問題ではなく、あるときから突然起きた問題です。いつから起きた問題なのかはわかりません。ちなみに、この問題は「バッチビルド」を使って複数のコンフィグレーションをリビルドした時に起きるようです。1つのコンフィグレーション(実行したいコンフィグレーション)のみをリビルドした後にはこの問題は起きません。また、リリース版、デバッグ版ともにこの問題は起きます。 下記はメッセージの内容です。(英語版のVCなのでメッセージは英語です。) (xxxは実行ファイル名、aaa、bbb、cccはソースファイル名) ---------------------------------------------------- One or more files are out of date or do not exist. These files need to be build: .\Debug\xxx.bsc .\Debug\xxx.exe .\Debug\aaa.obj .\Debug\bbb.obj .\Debug\ccc.obj <more file ...> Would you like to build them? ---------------------------------------------------- 原因や解決方法をご存知の方、ご教授をお願い致します。 環境:Win2000(日本語版)、VC++6.0(英語版)、MFC

  • #if

    #if defined(DECRYPTION_KEY_SCHEDULE) #if DEC_ROUND == NO_TABLES #define ff(x) (x) #else #define ff(x) inv_mcol(x) #ifdef dec_imvars #define d_vars dec_imvars #endif #endif 上の部分をコンパイルすると、 'ff'マクロが再定義されました というエラーメッセージが出るのですが、 なぜ再定義になるのか分かりません。  OS:Win2000 コンパイラ VC++ 6.0 以前は、同じようなエラーが出て、 #else を使わないで全て書き直しました。  よろしくお願いいたします。

専門家に質問してみよう