如何限制一个函数只能在debug模式下使用,如果是在非debug模式下使用就报错。目的是这样的:我写了一些测试用的函数,我想最终版本不要包括这些函数。但是怕自己没小心在其他不是测试的地方用它。也许不一定用这个debug模式来限制。有什么别的办法来限制我的这些测试函数只能在测试的地方用,不许在其他的地方用呢?

解决方案 »

  1.   

      #If...Then...#Else   指令  
                   
       
      条件编译已选择的   Visual   Basic   代码块。  
       
      语法  
       
      #If   expression   Then  
       
      statements  
       
      [#ElseIf   expression-n   Then  
       
      [elseifstatements]]  
       
      [#Else  
       
      [elsestatements]]  
       
      #End   If  
       
      #If...Then...#Else   指令的语法具有以下几个部分:  
       
      部分   描述    
      expression   必要。包含一个或多个条件编译常数、文字与运算符的任何表达式,其值为   True   或   False。    
      statements   必要。Visual   Basic   程序行或编译指令,如果关联的表达式为   True,则运行它们。    
      expression-n   可选。由一或多个条件编译常数、文字和运算符组成的任何一个表达式,其值为   True   或   False。    
      elseifstatements   可选。一个或多个程序行或编译命令,如果   expression-n   为   True,则运行它们。    
      elsestatements   可选。一个或多个程序行或编译命令,如果以前的expression   或   expression-n   中没有一个为   True,则运行它们。    
       
       
      说明  
       
      #If...Then...#Else   指令的作用与   If...Then...Else   语句相同,其差异在于   #If、#Else、#ElseIf,及   #End   If   指令没有单独成行的形式,也就是说,在指令所在的那一行,不能有其他代码出现。条件编译通常用来编译不同平台上的同一个程序。也可以用来避免调试程序代码出现在可执行程序中。条件编译时被排除的程序代码在最后的可执行文件中被完全略去,所以不会对程序的大小或功能有任何影响。  
       
      无论结果如何,都要计算所有表达式。所以,在表达式中用到的所有常数都必须加以定义—   任何未定义的常数都会被当作   Empty   来计算取值。  
       
      注意       Option   Compare   语句不会影响   #If   及   #ElseIf   语句中的表达式。条件编译指令中的表达式总是用   Option   Compare   Text   计算值。  
       
       
       
       
       
       
       
      #If...Then...#Else   指令示例  
      本示例在   #If...Then...#Else构造中引用条件式编译器常数,来决定编译那部分语句。  
       
      '   如果   Mac   常数为   true,则编译   #If后面的语句。  
      #If   Mac   Then    
            '.   将   Mac   语句写在此处。  
            '.  
            '.  
      '   否则,如果是   32   位窗口程序,则编译这个语句:  
      #ElseIf   Win32   Then        
            '.   将   32   位窗口程序语句写在此处。  
            '.  
            '.  
      '   再否则,则编译以下语句:  
      #Else  
            '.   将其他作业平台适用的语句写在此处。  
            '.  
            '.  
      #End   If   
      

  2.   

    lz,在模块里定义一个全局的布尔变量就可以了,类型于C++中的预编译
    lg:public const bTest as boolean=true '测试开关
    if (bText) then
       你的测试函数
    endif
      

  3.   

    楼主说的debug模式是不是说在VB的IDE环境下运行啊?
    下面这个函数可以检测是否在VB的IDE下:
    Private Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long
    '测试是否在VB_IDE环境下
    Public Function GetIDEmode() As Boolean
        Dim strFileName As String
        Dim lngCount As Long
        strFileName = String(255, 0)
        lngCount = GetModuleFileName(App.hInstance, strFileName, 255)
        strFileName = Left(strFileName, lngCount)
        If UCase(Right(strFileName, 7)) <> "VB6.EXE" Then
            GetIDEmode = False
        Else
            GetIDEmode = True
        End If
    End Function
      

  4.   


    Private Sub Command1_Click()
            If Run_InIDE Then
                MsgBox "在IDE运行"
            Else
                MsgBox "没有在IDE运行"
            End If
    End SubPrivate Function Run_InIDE() As Boolean
        Debug.Assert zSetTrue(Run_InIDE)
    End FunctionPrivate Function zSetTrue(ByRef bValue As Boolean) As Boolean
        zSetTrue = True
        bValue = True
    End Function
      

  5.   

    在工程属性中选择生成选项
    编译时,在条件编译参数中输入:DEBUG_VERSION = 1
    生成EXE时将其改为:DEBUG_VERSION = 0这样可以用伪指令:
    Private Sub Form_Load()
        #If DEBUG_VERSION Then
            MsgBox "IDE"
        #Else
            MsgBox "EXE"
        #End If
    End Sub
      

  6.   

    Private Function InIDE() As Boolean
    on error goto err1
       Debug.print 1/0
       InIDE=False
       exit Function 
    err1:
       InIDE=TRUE
    End Function
      

  7.   

    我觉得还是用条件编译比较好
    比如按我8楼的设置方法,你的函数可以类似如下这样写:public sub InDebug(s as string)
        #if DEBUG_VERSION then
            msgbox s
        #end if
    End Sub这样就可以保证只在调试模式下使用这个函数,生成EXE时只要将常量改为:DEBUG_VERSION = 0,也很方便... 
      

  8.   

    public function IsIDE() as boolean
        '判断是否处于IDE中.
        on error goto ErrHanele    IsIde = true
        debug.print 1/0     '触发错误,编译后这一行不会执行.
        IsIde = False
        
        Exit function
    ErrHanele:
    end function
    你的函数开头调用一下IsIDE就可以了:if iside then exit function/sub闪.
      

  9.   

    另外,可以引入IDE对象,判断当前的执行状态.那又是另一种方案了,我没做过....
      

  10.   

    跟单位同事学的:public bIDE as booleanprivate sub class_initialize
        debug.assert settrue(bide)
    end subfunction SetTrue(byref v as boolean) as boolean
        v = true
        settrue = true
    end function
      

  11.   

    刚看见,好像和Aisa思路基本一样.
      

  12.   

    sonic_andy,你在哪里.我在江苏胥口,为什么我这里刚刚登录不上去,登上去就又被T出来...而我登录后竟然显示了一下"欢迎您,sonic_andy!"......现在没有了你不会和我一个网吧上网吧- -!这是无盘,COOKIES冲突了?没可能呀.....
      

  13.   

    使用注释啊,在前面加上REM这样程序在运行时这条语句就不会运算。
      

  14.   

    用条件编译比较合适。即不输出到编译文件中,也容易发现无意的调用。InIDE() 通常是用在自动调整调试信息的输出方式上。
      

  15.   

    谢谢楼上各位,办法都很妙。我想一个过程,在测试的时候是public的,在真正交付运行的时候是private的。用了下面的办法,感觉挺好的。大家点评一下呗:)'bas1
    Public Sub test()
        #If DEBUG_VERSION Then
            MsgBox "IDE"
            Call dd
        #Else
            MsgBox "EXE"
        #End If
        'Call dd '在这里call编译就不会通过
    End Sub'bas2
    #If DEBUG_VERSION Then
    Public Sub dd()
    #Else
    Private Sub dd()
    #End If    MsgBox "dd"
    End Sub
      

  16.   

    正式版不要留下冗余的代码,应该是整个函数以及函数的调用处使用条件编译。
    Public Sub test()
        #If DEBUG_VERSION Then
            MsgBox "IDE"
            Call dd
        #Else
            MsgBox "EXE"
        #End If
    End Sub#If DEBUG_VERSION Then
    Public Sub dd()
        MsgBox "dd"
    End Sub
    #End If
      

  17.   

    to zhao:其实我是这样用的
    #If DEBUG_VERSION Then
    Public Sub m_tvw_NodeClick(ByVal Node As MSComctlLib.Node)
    #Else
    Private Sub m_tvw_NodeClick(ByVal Node As MSComctlLib.Node)
    #End If
        Call m_cmm.SendMessage_SelChanged(CndN(Node))
    End Sub
    因为那个投递消息的问题没解决,我只好把不该公开的成员函数在调试模式下公开了。这也是没有办法的办法啊。
      

  18.   

    另外想问问,像debug.assert这样的语句在正式运行的时候不会执行,但是还是会被编译到最后的可执行文件里么?
      

  19.   

    谢谢各位指点,获益匪浅,我把小结写在这里http://blog.csdn.net/slowgrace/archive/2009/04/16/4085429.aspx结帖!
      

  20.   


    MSDN里边说不会..用断言检验代码
    断言是一种方便的方法,它可以测试应该在您的代码中特定点出现的条件。设想一个 Assert 语句如同做一个假设。如果您的假设是True,将忽略该断言;如果您的假设是False,VB 将会引起您的注意。在 Visual Basic 中,断言总是以方法的形式出现:Debug 对象的 Assert 方法。Assert 方法需要一个 Boolean 类型参数,这个参数规定计算的条件。Assert 方法的语法如下:Debug.Assert(boolean expression)Debug.Assert 语句不会出现在编译后的应用程序中,但是,在设计环境中运行时,它将使应用程序进入中断模式,并突出显示包含这条语句的代码行(假定表达式的值为 False)。下例说明了Debug.Assert 语句的用法:Debug.Assert Trim(CustName) = "John Doe"在上例中,如果 CustName 的值不是 John Doe,则应用程序将进入中断模式;否则将正常执行。使用 Debug.Assert 与选定“当值为 True 时中断”选项来设置监视大致相同,只是前者在表达式的值为假时将中断执行。
      

  21.   

    to andy: 想问问你是如何看MSDN的,是装在自己硬盘上看的 还是到网上看的 入口在哪里?
      

  22.   

    to andy: 你装的什么版本的?我没装visual studio,单装了个MSDN,感觉挺不好用的,找东西找得晕头转向。
      

  23.   

    在 VB 中直接 F1 是使用 MSDN 最快捷的方法。如果单独使用:
    首先,确保“查看\定位选项卡”是选中的;
    然后,在“活动子集”中选“*Visual Basic 文档”;
    这样范围就小多了。
      

  24.   

    我下载的这个版本好像不对,里面都是.net
      

  25.   

    要找 MSDN Library Visual Studio 6.0,有中文版——大概是 98 年的。