VB6:禁用变体。

7
我有一个大型VB6项目,其中许多变量没有明确定义类型,所以它们自动默认为Variant类型。手工查找所有这些变量是一项巨大的任务,那么是否有任何自动化的方法呢?在VB.Net中,可以使用“Option Strict”禁用所有自动使用变体的选项,但VB6没有该选项。
现在,我已经将DefByte A-Z添加到每个类中,这使得默认类型为“Byte”,而不是“Variant”。这让我在运行时捕获了许多未定义的变量,因为只要它们被赋予大于255的值,就会立即出现。但这仍然不是完全可靠的。
是否有更可靠的方法来检测所有未定义的变量?

你不能简单地在整个解决方案中搜索“Variant”这个词吗? - pikzen
1
@pikzen:在VB6中,如果您根本不指定类型,则会得到Variant。 - MartW
1
此外,如果你有一行代码像是"Dim x, y, z AS Integer",只有z会被定义为整数类型。而x和y将会被定义为变体类型。幸运的是,这种行为在VB.NET中已经改变了。 - MartW
5
尝试使用 DefObj A-Z 替代,可以获得更加惊人的编译时和运行时错误。 - wqw
4个回答

5

我曾经使用Aivosto's Project Analyzer来寻找类似这样的问题。它有一个演示版,可以让您了解它的功能。


同意。这款软件价格不高,可以快速地节省时间并避免问题,很快就能回本。 - Brian Hooper

4

使用Option Explicit来装饰你的模块。

这个短语应该放在你创建的每一个模块的顶部。这样做可以使得当遇到未声明的变量时,会产生编译器错误。

Option Explicit不会阻止无类型变量声明,例如:

Dim i

变量i将被声明为变体类型,即使定义了Option Explicit,也不会引发编译器错误。

2

我不认为有一种“万无一失”的方法可以检测出所有未定义的变量。然而,Option Explicit语句会要求在该语句所在的模块中声明所有变量,因此编译器将标记任何未声明变量的情况。还有一个IDE选项,可以自动将此语句添加到任何新模块的开头。


如果您在代码中使用了"Option Explicit",那么为什么还要问这个问题呢? - Mark Bertenshaw
@MarkBertenshaw - Option Explicit 检查未声明的变量。它不检查已声明为 Variant 的变量,这是 OP 所需的。 - Matt Wilko

2

请使用程序员文本编辑器(我使用UltraEdit),并在项目源目录中进行大规模搜索。

首先搜索Variant(显然),尽管您可能已经这样做了。

接下来,使用正则表达式类型的搜索,搜索类似以下内容:

 *Dim [a-zA-Z][a-zA-Z0-9_]*\p

那应该能够处理带有未指定数据类型的“Dim x”情况。
使用“*Dim [a-zA-Z][a-zA-Z0-9_]*,.*”查找“Dim a,b,c As Integer”类型的场景。
对于奇怪的情况,如“Dim a As Integer,b,c As Long”,请使用“*Dim。*,[a-zA-Z][a-zA-Z0-9_]*,.*”。
将上述搜索中的“Dim”更改为“Private”和“Global”,就可以涵盖几乎所有情况了。

1
“ReDim” 也应该包括在内,因为VB不需要先“Dim”。而且它不适用于数组、函数参数、返回值等。所以虽然这是一个不错的尝试,但它有一些漏洞 ;) - Maestro
我只使用过 Redim 与数组。我确实考虑到了参数问题,但说实话,我对正则表达式的熟练程度还不够,无法为每个正则表达式编写一个解决方案。我会将此留给比我更有雄心壮志的人 :) - tcarvin
公共和私有关键字也可以用于声明字段吗?这些也需要正则表达式。 - MarkJ
变量?变量?哦,你一定是指变量。那么函数返回值呢?过程参数呢?正则表达式看起来像一个聪明的黑客技巧,直到你看到它有多薄弱。 - Bob77
虽然不完美,但我宁愿用十几个编写良好的搜索得到80%的结果,也不愿意一无所获! - tcarvin
@markj8提到了私有变量的重复,但是我错过了公共变量。我也错过了友元变量。 - tcarvin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接