AS3 条件编译

转:http://www.lite3.cn/blog/?p=404&cpage=1

知道C/C++ 有条件编译,一直想着AS要是也有条件编译就好了,今天搜了半天Google,终于让我找到了 :grin:
下面翻译livedocs.adobe.com上一篇文章,英文不怎么好,有些是Google翻译的,然后我再纠正下语句,大家不要见怪。 :roll:

想要包含或排除某些代码块,你可以使用条件编译。mxmlc编译器允许你在编译时传递常量值到应用程序。通常,您传递一个布尔值用于包含或排除调试代码。下面的例子通过使用一个Boolean常量内联代码块:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> CONFIG::debugging {
// Execute debugging code here.
}

你可以使用compiler.define编译器选项传递一些常量。这些常量可以是一个Boolean,String,Number或表达式。然后,这些常量可以在应用程序的源代码中作为全局常量访问。
要使用difine选项,可定义一个命名空间配置常量,变量名和值使用以下语法:

-define=namespace::variable_name,value

可以定义任何你想使用是命名空间,下面是示例定义一个debugging 为true的常量在CONFIG命名空间。

-define=CONFIG::debugging,true

可以定义多个常量在同一个命令行里,用多个define隔开,例如:

mxmlc -define=CONFIG::debugging,true -define=CONFIG::release,false MyApp.mxml

也可以在flex-config.xml 文件里定义这些常量,而不必在命令行里定义,你可以这样写:

复制代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> < compiler >
< define >
< name > CONFIG::debugging </ name >
< value > true </ value >
</ define >
< define >
< name > CONFIG::release </ name >
< value > false </ value >
</ define >
</ compiler >
复制代码

在Flex Ant里 可以设置这些常量作为元素定义,类似下面的示例:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> < mxmlc ... >
< define name ="CONFIG::debugging" value ="true" />
< define name ="CONFIG::release" value ="false" />
</ mxmlc >

使用内置常量
你可以内联ActionScript常量,以一个Boolean常量为条件编译顶级函数,类,变量定义,在C/C++里通常使用#IFDEF 预处理命名。不能使用Boolean常量来条件编译metadata 或 import 语句。
下面的示例来条件编译一个类定义。

复制代码
代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> // compilers/MyButton.as
package
{
import mx.controls.Button;

CONFIG::debugging
public class MyButton extends Button
{
public function MyButton()
{
super ();
// Set the label text to blue.
setStyle( " color " , 0x0000FF );
}
}

CONFIG::release
public class MyButton extends Button
{
public function MyButton()
{
super ();
// Set the label text to red.
setStyle( " color " , 0xFF0000 );
}
}
}
复制代码

 

你也可能传递一个String或Number到程序并当做内置常量使用它们,或许你使用 #define指令在C/C++中。例如你传递一个名叫 NAMES::Company的常量,你可以替换作为一个常量在程序中使用:
private static const companyName:String = NAMES::Company;

传递表达式:
你也可以传递一个能在编译时获得值的表达式,下面的示例结果为false。

-define+=CONFIG::myConst,"1 > 2"

下面是示例结果为3。

-define+=CONFIG::myConst,"4 - 1"

表达式可包含常量或其他配置值:

-define+=CONFIG::bool2,false -define+=CONFIG::and1,"CONFIG::bool2 && false"

一般情况下你应该把String 用引号包含,以便告诉编译器它们是一个单独的参数。
传递String
当传递字符串,您必须添加额外的引号,以确保他们正确地编译器解析。
定义命令行字符串时,你必须使用双引号,如果本身就是双引号,则使用转义字符\" 或者单引号。
下面的示例演示了命令行里使用字符串的方法:

-define+=NAMES::Company,"'Adobe Systems'" -define+=NAMES::Ticker,"\"ADBE\""

在配置文件里定义字符串,你必须用双引号或单引号包含字符串:

复制代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> < define >
< name > NAMES::Company </ name >
< value > 'Adobe Systems' </ value >
</ define >
< define >
< name > NAMES::Ticker </ name >
< value > "ADBE" </ value >
</ define >
复制代码

在命令行传递一个空字符串,则必须用双引号包含单引号。

-define+=CONFIG::debugging,"''"

在配置文件里传递一个空字符串,则可以用单引号或双引号,都OK的

------------------------------------------------------------------------------------------------------
呵呵终于翻译完了,其实条件编译也可以在FD 和 Flash CS4里配置的。
Flash CS4 条件编译
在Flash CS4 里设置:(Ctrl+Shift+F12) 调出发布设置 ==> Flash选项卡 ==> AS脚本设置,调出 高级ActionScript3.0设置 ==> 选择配置常数选项卡 ==> 添加自己喜欢的预定义常量 格式为 namespace::variable_name ,然后后面是常量值。
FD条件编译
在FD里设置:Project菜单 ==> properties...子菜单,调出Properties窗口 ==> 选择Compiler Options选项卡 ==> 选择Advanced选单里的Advanced Compiler Options ==> 点右边的 ... 按钮,调出输入窗口==> 输入编译选项就ok了。

<think>我们正在讨论的是VB6.0中的条件编译,而不是一般的条件编程。用户之前的问题是关于条件编程,但这次明确要求条件编译条件编译是VB6中一个特殊功能,它允许在编译时根据条件决定哪些代码被包含进最终程序。这通常用于调试、多版本支持等场景。 关键点: 1. 使用`#If...Then...#Else`指令 2. 条件编译常量可以在项目属性中设置(通过“工程”->“属性”->“生成”选项卡)或者在代码中使用`#Const`定义 3. 条件编译常量可以是布尔值、数值或字符串,但通常使用布尔值(True/False) 示例: 我们可以在代码中定义常量,然后根据常量的值决定编译哪部分代码。 步骤: 1. 定义条件编译常量(可以在项目级别或模块级别) - 项目级别:工程属性 -> 生成 -> 条件编译参数(例如:DebugMode = 1) - 代码级别:使用`#Const`(仅在该模块有效) 2. 使用条件编译指令包裹代码 示例代码: ```vb &#39; 在模块顶部定义模块级条件编译常量(可选,如果已在项目属性中设置则不需要) #Const DebugMode = 1 &#39; 1表示True,0表示False Sub Test() #If DebugMode Then MsgBox "调试模式已开启" #Else MsgBox "这是发布版本" #End If End Sub ``` 另一个示例:根据不同的操作系统条件编译 ```vb #Const WinVersion = 1 &#39; 1代表Windows XP,2代表Windows 7 Sub ShowOS() #If WinVersion = 1 Then MsgBox "运行在Windows XP上" #ElseIf WinVersion = 2 Then MsgBox "运行在Windows 7上" #Else MsgBox "未知操作系统" #End If End Sub ``` 注意:条件编译常量与普通常量不同,它们使用`#Const`定义,且只在条件编译指令中有效。 另外,条件编译常量也可以在项目属性中设置(全局有效): 在“工程属性”对话框的“生成”选项卡中,有一个“条件编译参数”文本框,可以输入类似:DebugMode=1, WinVersion=2 这样,在代码中就不需要写`#Const`了。 重要:条件编译指令在编译时被处理,不会包含在最终的可执行文件中(即条件不满足的代码不会被编译进去)。 应用场景: 1. 调试代码和发布代码分离 2. 为不同平台编译不同代码 3. 多语言版本(通过条件编译选择不同语言资源) 错误处理:条件编译中如果使用了未定义的常量,则会被视为0(False)或空字符串。 因此,在条件编译中,我们通常使用: #If 常量 Then -> 如果常量不为0且不为空字符串,则视为True 注意:条件编译指令不能嵌套在普通代码块中(如普通If语句内部),但可以嵌套条件编译指令。 嵌套示例: ```vb #If DebugMode Then #If TraceMode Then &#39; 同时满足DebugMode和TraceMode #End If #End If ``` 相关问题: 1. VB6条件编译常量的作用范围是什么? 2. 如何在VB6中设置全局条件编译常量? 3. 条件编译和普通条件语句(If...Then)有什么区别? 4. 条件编译支持哪些类型的常量? 引用:VB6.0条件编译功能是管理代码版本和平台适配的有效工具[^1]。</think>### VB6.0 条件编译详解 条件编译是VB6.0中通过**预处理器指令**实现的特殊编译技术,允许根据预定义条件决定哪些代码块会被编译进最终程序。主要使用 `#If...Then...#Else` 指令集实现,适用于调试、多版本支持和平台适配等场景。 #### 一、核心语法结构 ```vb #If 条件表达式 Then &#39; 条件为真时编译的代码 #ElseIf 其他条件 Then &#39; 备选条件代码 #Else &#39; 默认编译代码 #End If ``` #### 二、使用步骤 1. **定义条件常量**(两种方式): - 项目级定义(全局有效): ```vb &#39; 工程属性 → 生成 → 条件编译参数 DebugMode = 1 ; Platform = "Windows" ``` - 模块级定义(局部有效): ```vb #Const DebugMode = 1 #Const Version = 2.0 ``` 2. **条件编译应用**: ```vb #If DebugMode = 1 Then MsgBox "调试模式已启用" &#39; 调试专用代码(如日志记录) #Else &#39; 正式版优化代码 #End If ``` #### 三、典型应用场景 1. **调试/发布版本切换** ```vb #Const DebugMode = 1 &#39; 1=调试, 0=发布 Sub SaveData() #If DebugMode Then Log "开始保存数据..." &#39; 仅调试版记录日志 #End If &#39; 核心业务代码... End Sub ``` 2. **多平台适配** ```vb #If Win32 Then Declare Function APICall Lib "kernel32" Alias "Proc" () #ElseIf MacOS Then Declare Function APICall Lib "CarbonLib" Alias "Proc" () #End If ``` 3. **版本特性控制** ```vb #If Version >= 2.0 Then &#39; 2.0版新增功能 ImplementNewFeature() #Else &#39; 旧版兼容代码 LegacyImplementation() #End If ``` #### 四、特殊语法特性 1. **逻辑运算符支持**: ```vb #If (DebugMode = 1) And (Version > 1.5) Then &#39; 双条件满足时编译 #End If ``` 2. **常量类型支持**: - 布尔值:`#Const EnableFeature = True` - 数值:`#Const MaxUsers = 10` - 字符串:`#Const OS = "Windows"` 3. **未定义常量处理**: ```vb #If UndefinedConst Then &#39; 未定义时视为False &#39; 不会执行 #End If ``` #### 五、注意事项 1. **作用域规则**: - `#Const` 定义仅当前模块有效 - 项目级常量需在工程属性中设置 2. **与普通条件语句区别**: | 特性 | 条件编译 (`#If`) | 普通条件 (`If`) | |--------------|-----------------------|-------------------| | 执行阶段 | 编译时 | 运行时 | | 最终程序大小 | 仅包含符合条件的代码 | 包含所有分支代码 | | 性能影响 | 无运行时开销 | 有运行时判断开销 | 3. **调试技巧**: - 使用条件编译隔离测试代码: ```vb #If DEBUG Then Private Sub Test_Case() &#39; 单元测试代码 End Sub #End If ``` - 通过编译常量启用/禁用性能监控: ```vb #If PerfMonitor Then Dim StartTime As Double StartTime = Timer #End If ``` > 条件编译是VB6管理代码复杂度的有效工具,特别适合大型项目维护[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值