2

基本上,在我的 VB6 代码中声明 Windows API 函数时,会附带许多需要声明或与该函数一起使用的常量,实际上,通常这些常量中的大多数都没有使用,您最终只使用其中一个或因此,在进行 API 调用时,我使用条件编译参数来排除这些(和其他东西),使用如下所示:

IncludeUnused = 0 : Testing = 1

(这就是我设置两个条件编译参数的方式(默认情况下它们是布尔类型)。

因此,许多未使用的东西被排除在外:

#If IncludeUnused Then
' Some constant declarations and API declarations go here, sometimes functions
' and function calls go here as well, so it's not just declarations and constants
#End If

我还使用类似的包装器,使用在 VB6 属性窗口“制作”选项卡的条件编译参数输入字段中声明的测试布尔值。测试布尔值用于在我处于测试模式时显示消息框和类似的东西,当然,如果我将测试设置为 0(当我在测试时显然是 1),这些消息框会被删除(不显示) )。

问题是,我尝试将IncludeUnusedTesting设置为 0 和 1,反之亦然,总共四 (4) 个组合,无论我将这些值设置为哪种组合,我的 VB6 EXE 的输出 EXE 文件大小都不会改变!使用 Fast Code 和 Small Code 编译为 Native Code 时,它​​始终为 49,152。

此外,如果我在TestingIncludeUnused的四 (4) 种组合下编译为 p 代码,无论如何我总是以文件大小 32,768 结束。

这让我发疯,因为它让我相信实际上并没有发生任何变化,即使它确实发生了。为什么当从编译中排除代码段时,文件大小仍然相同?我错过了什么或做错了什么,或者我计算错了什么?

我已经考虑过可能 VB6 自动不编译未用于最终输出 EXE 的代码的选项,但我从几个来源中读到这不是真的,因为如果它被包含,它会被编译(纠正我如果我错了),如果这是对的,那么就不需要使用IncludeUnused布尔值来删除未使用的代码......?

如果有人能阐明这些想法,我将不胜感激。

4

4 回答 4

5

很可能是大小差异非常小,并且 exe 大小被填充到下一个 512 或 1024 字节对齐。尝试用 zip 压缩 exe,看看 zip 文件的大小是否不同。

于 2012-11-10T16:23:02.283 回答
2

您误解了编译器的作用。VB6 编译器的输出是代码。常量只是值的占位符,它们不是代码。编译器将它们添加到其符号表中。当它稍后在您的代码中遇到使用该常量的语句时,它会将常量替换为其值。无论您使用常量还是硬编码语句中的值,该语句都会产生完全相同的代码。

因此,这自动意味着如果您从未在任何地方实际使用过该常量,那么生成的代码就没有任何区别。您通过使用#If 完成的所有工作就是使编译器的符号表更小。这是毫无意义的事情,您从编译速度中获得的实际收益是无法衡量的。符号表被实现为哈希表,它们具有 O(1) 的摊销复杂度。

您使用常量只是为了使您的代码更具可读性。如果需要,可以轻松更改常量值。通过使用#If,您实际上降低了代码可读性。

于 2012-11-10T16:53:53.440 回答
2

VB6 可执行文件大小被填充为 4KB 块,因此如果代码差异很小,则对可执行文件没有影响。

于 2012-11-11T11:59:52.477 回答
1

您无法在条件编译指令中测试运行时数据。

这些指令使用由文字值、运算符和 CC 常量组成的表达式。设置常量值的一种方法是:

#Const IncludeUnused = 0
#Const Testing = 1

您还可以通过项目属性定义它们以进行 IDE 测试。转到该对话框中的 Make 选项卡,然后单击 Help 按钮了解详细信息。

也许这是您设置值的地方?如果是这样,请考虑这只是为以后的读者提供的附加信息,而不是答案。

请参阅#If...Then...#Else 指令

于 2012-11-10T17:50:13.083 回答