VB6でVCのTRACEやASSERTみたいなことできませんか?


VB6ヶ月目  2009-06-11 00:41:25  No: 142047

開発当初から一番やりたかったことですが、いまだにできないので質問いたします。

VCでは#ifdefや#defineなどを使って無意味な行を割り当てることでTRACEやASSERTを作ることができますが、VBでは無意味な行というのが作れるのかいまだにやり方がわかりません。

VC的には
#ifdef DEBUG
#define TRACE (msg) printf(msg) //case debug
#else //DEBUG
TRACE (msg) void(0) //case not debug
#endif //DEBUG

とやればDEBUGが定義されているときはcase debug、そうでないときはcase not debugとなり、処理自体が行われず、リリース時にデバッグメッセージが出るというバグを防げます。

これをVB6でやりたいのですが、そもそもVB6には#defineがないですし、vbのコンパイル的にも何もオブジェクトコードをはかないような、なにか良い書き方はないでしょうか?

ちなみに、私は仕方ないので空の関数(何もしない関数)を作ることでとりあえず対応しています。

では宜しくお願いいたします。


オショウ  2009-06-11 00:53:58  No: 142048

プロジェクトのプロパティで、実行ファイルの作成タブの中
条件付きコンパイル引数の設定で代用できると思いますが・・・

例えば
条件付きコンパイル引数欄に
DEBUG_FLG=1

として、プログラムのコード中に
#If DEBUG_FLG Then

    MsgBox "DEBUG", vbInformation Or vbOKOnly, "INFO"

#Else
#End If

としてみるとか・・・

VCと同等とはいきませんが、機能的にはなんとかるかと。

以上。参考まで・・・


VB6ヶ月目  2009-06-11 01:05:15  No: 142049

ご返答ありがとうございます。

条件付きコンパイル引数は利用しております。
この場合、何ができないかというと、オショウさんの例を出させていただくと、

#If DEBUG_FLG Then

Public Sub ASSERT(msg As String)
    MsgBox "DEBUG:" & msg, vbInformation Or vbOKOnly, "INFO"
End Sub

#Else

Public Sub ASSERT(msg As String)
End Sub

#End If

としかかけないということなんです。
下の、空のASSERTをどうにか全くオブジェクトコードを吐かないものにできないのかなと…。

ちなみに下の関数がコンパイル時になくなるのならば問題ないんですが、そこまでVB6は最適化してくれるのでしょうか?しないんじゃないかと思って、質問致しました。


魔界の仮面弁士  2009-06-11 02:41:33  No: 142050

> この場合、何ができないかというと、オショウさんの例を出させていただくと、
そのパターンだと、呼び出し側も
  #If DEBUG_FLG Then
    Call ASSERT("MSG")
  #End If
にする必要がありますね。

> TRACEやASSERTを作ることができますが
VB6 でアサーションというと、
  Debug.Assert Foo("TEST")
という構文になりますが、この Foo メソッドの空実装を
EXE 生成時に含めたくない、という事でしょうか。
(含まれていると、何か都合が悪いのでしょうか?)

> ちなみに下の関数がコンパイル時になくなるのならば問題ないんですが
『空のメソッド』だからといって、削除するわけにはいかないと思います。

『どこからも呼び出されていない Private メソッドを削除する』事は許容できそうですが、
判断も難しいでしょうし、そこまでは面倒を見てくれないでしょうね。

> そこまでVB6は最適化してくれるのでしょうか?
コンパイルされた EXE をみたところ、
  「コードの実行速度を最適化」
  「コードのサイズを最適化」
のいずれの場合でも、削除されずに残っているようです。


VB6ヶ月目  2009-06-11 04:53:43  No: 142051

ご返答ありがとうございます。

>含まれていると、何か都合が悪いのでしょうか?
たいした都合ではないのですが、exeのサイズが増えるのでやだなぁと(笑)。

>コンパイルされた EXE をみたところ、
>  「コードの実行速度を最適化」
>  「コードのサイズを最適化」
>のいずれの場合でも、削除されずに残っているようです。
なるほど…私には方法がいまひとつわからなかったのですが、お教えいただいてありがとうございます。

どうやらそのお話を伺って、本件はVB6では言語仕様的に、できないことの1つのように思えてきました。

ありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加