【发布时间】:2012-02-21 13:08:50
【问题描述】:
如何在 VB 6 中执行类似于以下 C 代码的操作?
#ifdef _DEBUG_
// do things
#else
// do other things
#end if
【问题讨论】:
标签: vb6 conditional-compilation
如何在 VB 6 中执行类似于以下 C 代码的操作?
#ifdef _DEBUG_
// do things
#else
// do other things
#end if
【问题讨论】:
标签: vb6 conditional-compilation
它与您习惯的其他语言几乎相同。语法如下:
#If DEBUG = 1 Then
' Do something
#Else
' Do something else
#End If
如果您只记得语法与 VB 6 中的其他流控制语句完全相同,那么很容易记住,除了编译时条件以井号 (#) 开头。
诀窍实际上是定义DEBUG(或其他)常量,因为我很确定默认情况下没有定义一个。有两种标准的做法:
使用#Const 关键字在每个源文件的顶部定义常量。您以这种方式建立的定义在整个源模块中都是有效的。它看起来像:
#Const DEBUG = 1
在项目的属性中设置常量。这将定义一个在整个项目中都有效的常量(并且可能是您想要的“调试”模式指示器)。
为此,请在“项目属性”对话框的“生成”选项卡上的“条件编译常量”文本框中输入如下内容:
DEBUG = 1
您可以在此对话框中定义多个常量,方法是用冒号 (:) 分隔每个常量:
DEBUG = 1 : VERSION2 = 1
请记住,未定义的任何常量都假定为 0。
【讨论】:
DEBUG 符号不是自动定义的,你必须自己做。所以切换到“释放”模式是手动操作。是的,在本例中,您需要将编译时 DEBUG 常量更改为 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。
【讨论】:
On Error Resume Next,对吧? :-)
要达到和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 中运行时,调用函数会产生额外的开销(非常小)。编译后,这将计算为一个简单的数字比较。
【讨论】:
这是我简短而稳定的代码。我认为它比条件常量更好,因为您不需要在每次复杂化时都更改它。
Public Function InIDE() As Boolean
On Error Resume Next
Debug.Print 0 / 0
InIDE = Err.Number <> 0
End Function
【讨论】: