【问题标题】:Debug Mode In VB 6?VB 6 中的调试模式?
【发布时间】:2012-02-21 13:08:50
【问题描述】:

如何在 VB 6 中执行类似于以下 C 代码的操作?

#ifdef _DEBUG_
    // do things
#else
    // do other things
#end if

【问题讨论】:

    标签: vb6 conditional-compilation


    【解决方案1】:

    它与您习惯的其他语言几乎相同。语法如下:

    #If DEBUG = 1 Then
        ' Do something
    #Else
        ' Do something else
    #End If
    

    如果您只记得语法与 VB 6 中的其他流控制语句完全相同,那么很容易记住,除了编译时条件以井号 (#) 开头。

    诀窍实际上是定义DEBUG(或其他)常量,因为我很确定默认情况下没有定义一个。有两种标准的做法:

    1. 使用#Const 关键字在每个源文件的顶部定义常量。您以这种方式建立的定义在整个源模块中都是有效的。它看起来像:

       #Const DEBUG = 1
      
    2. 在项目的属性中设置常量。这将定义一个在整个项目中都有效的常量(并且可能是您想要的“调试”模式指示器)。

      为此,请在“项目属性”对话框的“生成”选项卡上的“条件编译常量”文本框中输入如下内容:

       DEBUG = 1
      

      您可以在此对话框中定义多个常量,方法是用冒号 (:) 分隔每个常量:

       DEBUG = 1 : VERSION2 = 1
      

    请记住,定义的任何常量都假定为 0。

    【讨论】:

    • 这看起来棒极了,只是一个问题,当您编译 exe 的发布版本时,我假设您需要设置 DEBUG = 0 或者 VB 是否自动检测到这一点并以某种方式设法确保调试内容未编译(我收集 const 必须在内部硬编码到编译器中才能做到这一点,不太可能,但只是想确保)。所以在发布之前只需设置 DEBUG = 0 就可以编译了吗?
    • @Erx:不,编译器没有自动检测。 DEBUG 符号不是自动定义的,你必须自己做。所以切换到“释放”模式是手动操作。是的,在本例中,您需要将编译时 DEBUG 常量更改为 0。
    • 如果将 DEBUG = 1 放入代码常规声明模块区域会发生什么...?它仍然有效还是失败?
    • @Erx:我不知道你所说的“代码通用声明模块区域”是什么意思。你的意思是在模块的源文件的顶部?它只会在该模块中生效。如果您希望它应用于整个项目,则需要将其添加到项目属性或项目中的所有代码文件中。
    • @Erx:那不会做任何事情。您需要在该行前面加上 # 符号。这与常规编译器无关。这是一个单独的阶段,发生在常规编译之前。在代码文件中定义符号只为该代码文件声明它。预处理器符号没有“全局范围”之类的东西。这就是您需要使用对话框的原因。
    【解决方案2】:

    Cody 已经向您介绍了条件编译。我想补充一点,如果您在 IDE 上进行调试时想要不同的行为(例如,关闭您自己的错误处理以便 IDE 捕获错误),您不需要 条件编译。您可以像这样在运行时检测 IDE。

    On Error Resume Next 
    Debug.Print 1/0 
    If Err=0 then 
      'Compiled Binary 
    Else 
      'in the IDE 
    End if
    

    这是可行的,因为在编译的 EXE 中省略了 Debug.Print。

    • 编辑记得关闭 On Error Resume Next !
    • 编辑您可以将检查包装在 this 之类的函数中(感谢 CraigJ)

    【讨论】:

    • 这是一个不错的提示,但您可能想在某个时候关闭On Error Resume Next,对吧? :-)
    • 为什么? On Error Resume Next 是最好的错误处理策略 - 用户不会以这种方式看到任何错误 :) 好吧,至少在他没有查看实际数据之前……更严重的是,我们只是使用全局变量(inEXE) 并在程序启动时对其进行初始化;调试和跟踪标志相同。是的,这种方法不使用预处理器指令,但与数据库访问甚至简单的 UI 绘图相比,运行时开销(来自检查各种标志)可以忽略不计。
    • 您最好声明一个全局标志,并在 Sub Main 开头的某处进行此检查。这样您就可以以最小的开销检查调试。
    • @MarkBertenshaw 我最小化开销的方法是将代码包装到全局函数中,并使用本地静态来确保只执行一次检查
    【解决方案3】:

    要达到和MarkJ一样的效果,但是有错误处理,可以使用下面的代码。

    Public Function GetRunningInIDE() As Boolean
    
       Dim x As Long
       Debug.Assert Not TestIDE(x)
       GetRunningInIDE = x = 1
    
    End Function
    
    Private Function TestIDE(x As Long) As Boolean
    
        x = 1
    
    End Function
    

    当您在 IDE 中运行时,调用函数会产生额外的开销(非常小)。编译后,这将计算为一个简单的数字比较。

    【讨论】:

    • +1。这实际上看起来像我们在工作中实际使用的,但我没有发布该代码,因为它属于我的雇主。
    【解决方案4】:

    这是我简短而稳定的代码。我认为它比条件常量更好,因为您不需要在每次复杂化时都更改它。

    Public Function InIDE() As Boolean
      On Error Resume Next
      Debug.Print 0 / 0
      InIDE = Err.Number <> 0
    End Function
    

    【讨论】:

    • +1 最佳答案,因为它又短又甜,并且不需要在需要重新编译时更改项目属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    相关资源
    最近更新 更多