vb6中的调试模式?

vb6中的调试模式?,vb6,conditional-compilation,Vb6,Conditional Compilation,如何在VB6中执行类似于以下C代码的操作 #ifdef _DEBUG_ // do things #else // do other things #end if 它和你习惯的其他语言几乎一样。语法如下所示: #If DEBUG = 1 Then ' Do something #Else ' Do something else #End If 只要记住语法与VB6中的其他流控制语句完全相同,就很容易记住,除了编译时条件以磅符号(#)开头 诀窍实际上是定义DEB

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

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

它和你习惯的其他语言几乎一样。语法如下所示:

#If DEBUG = 1 Then
    ' Do something
#Else
    ' Do something else
#End If
只要记住语法与VB6中的其他流控制语句完全相同,就很容易记住,除了编译时条件以磅符号(
#
)开头

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

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

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

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

     DEBUG = 1
    

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


  • 请记住,任何未定义的常数都假定为0。

    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

    • 编辑记住关闭“错误时继续下一步”
    • 编辑您可以将支票包装在一个函数中,如(谢谢CraigJ)

    要实现与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中运行时,调用一个函数会有额外的开销(这个开销小得可笑)。编译时,这将计算为一个简单的数字比较。

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

    公共函数InIDE()作为布尔值 出错时继续下一步 调试。打印0/0 InIDE=错误编号0 端函数
    这是一个很好的提示,但您可能希望在某个时候关闭“下一步错误恢复时的
    ,嗯?:-)为什么?在错误恢复上,下一步是最佳错误处理策略-用户不会以这种方式看到任何错误:)好吧,至少在他不查看实际数据之前。。。更严重的是,我们只是使用全局变量(INXE)并在程序启动时初始化它;调试和跟踪标志也是如此。是的,这种方法不使用预处理器指令,但与数据库访问甚至简单的UI绘图相比,运行时开销(检查各种标志)可以忽略不计。您最好声明一个全局标志,并在Sub Main开始的某个位置执行此检查。这样,您就可以用最小的开销检查调试。@MarkBertenshaw我最大限度地减少开销的方法是将代码包装到一个全局函数中,并使用一个局部静态来确保只在这看起来很好的情况下执行检查,只需问一个问题,当编译exe的发布版本时,我假设您需要设置DEBUG=0,或者VB是否自动检测到这一点,并以某种方式设法确保调试内容未被编译(我收集到const必须在内部硬编码到编译器中才能做到这一点,这不太可能,但只是想确保)。所以在发布之前,只需将DEBUG=0和ur设置为ready to compile?@Erx:No,编译器没有自动检测。
    DEBUG
    符号不是自动定义的,您必须自己定义。因此,切换到“释放”模式是一种手动操作。是的,在本例中,您将编译时
    DEBUG
    常量更改为0。如果将DEBUG=1放入代码常规声明模块区域,会发生什么情况。。。?它还能工作还是失败?@Erx:我不知道你说的“代码通用声明模块区域”是什么意思。您的意思是在模块源文件的顶部吗?它只会在该模块中生效。如果要将其应用于整个项目,则需要将其添加到项目属性或项目中的所有代码文件中。@Erx:这没有任何作用。您需要在该行前面加一个
    #
    符号。这与常规编译器无关。这是一个单独的阶段,发生在常规编译之前。在代码文件中定义符号仅为该代码文件声明该符号。预处理器符号没有“全局范围”这样的东西。这就是为什么你需要使用这个对话框。这实际上看起来像我们在工作中实际使用的代码,但我没有发布这段代码,因为它属于我的雇主。+1最佳答案,因为它简短而甜美,并且不需要在需要重新编译时更改项目属性。
    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
    
    Public Function InIDE() As Boolean
      On Error Resume Next
      Debug.Print 0 / 0
      InIDE = Err.Number <> 0
    End Function