開発当初から一番やりたかったことですが、いまだにできないので質問いたします。
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のコンパイル的にも何もオブジェクトコードをはかないような、なにか良い書き方はないでしょうか?
ちなみに、私は仕方ないので空の関数(何もしない関数)を作ることでとりあえず対応しています。
では宜しくお願いいたします。
プロジェクトのプロパティで、実行ファイルの作成タブの中
条件付きコンパイル引数の設定で代用できると思いますが・・・
例えば
条件付きコンパイル引数欄に
DEBUG_FLG=1
として、プログラムのコード中に
#If DEBUG_FLG Then
MsgBox "DEBUG", vbInformation Or vbOKOnly, "INFO"
#Else
#End If
としてみるとか・・・
VCと同等とはいきませんが、機能的にはなんとかるかと。
以上。参考まで・・・
ご返答ありがとうございます。
条件付きコンパイル引数は利用しております。
この場合、何ができないかというと、オショウさんの例を出させていただくと、
#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は最適化してくれるのでしょうか?しないんじゃないかと思って、質問致しました。
> この場合、何ができないかというと、オショウさんの例を出させていただくと、
そのパターンだと、呼び出し側も
#If DEBUG_FLG Then
Call ASSERT("MSG")
#End If
にする必要がありますね。
> TRACEやASSERTを作ることができますが
VB6 でアサーションというと、
Debug.Assert Foo("TEST")
という構文になりますが、この Foo メソッドの空実装を
EXE 生成時に含めたくない、という事でしょうか。
(含まれていると、何か都合が悪いのでしょうか?)
> ちなみに下の関数がコンパイル時になくなるのならば問題ないんですが
『空のメソッド』だからといって、削除するわけにはいかないと思います。
『どこからも呼び出されていない Private メソッドを削除する』事は許容できそうですが、
判断も難しいでしょうし、そこまでは面倒を見てくれないでしょうね。
> そこまでVB6は最適化してくれるのでしょうか?
コンパイルされた EXE をみたところ、
「コードの実行速度を最適化」
「コードのサイズを最適化」
のいずれの場合でも、削除されずに残っているようです。
ご返答ありがとうございます。
>含まれていると、何か都合が悪いのでしょうか?
たいした都合ではないのですが、exeのサイズが増えるのでやだなぁと(笑)。
>コンパイルされた EXE をみたところ、
> 「コードの実行速度を最適化」
> 「コードのサイズを最適化」
>のいずれの場合でも、削除されずに残っているようです。
なるほど…私には方法がいまひとつわからなかったのですが、お教えいただいてありがとうございます。
どうやらそのお話を伺って、本件はVB6では言語仕様的に、できないことの1つのように思えてきました。
ありがとうございます。
ツイート | ![]() |