Home » 经验之谈 » AS3 条件编译

AS3 条件编译

发表评论 阅读评论

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

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

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 文件里定义这些常量,而不必在命令行里定义,你可以这样写:

<compiler>
    <define>
        <name>CONFIG::debugging</name>
        <value>true</value>
    </define>
    <define>
        <name>CONFIG::release</name>
        <value>false</value>
    </define>
</compiler>

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

<mxmlc ... >
    <define name="CONFIG::debugging" value="true"/>
    <define name="CONFIG::release" value="false"/>
</mxmlc>

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

// 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""

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

<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.jpg

在Flash CS4 里设置:(Ctrl+Shift+F12) 调出发布设置 ==> Flash选项卡 ==> AS脚本设置,调出 高级ActionScript3.0设置 ==> 选择配置常数选项卡 ==> 添加自己喜欢的预定义常量 格式为 namespace::variable_name ,然后后面是常量值。

fd.jpg

在FD里设置:Project菜单 ==> properties...子菜单,调出Properties窗口 ==> 选择Compiler Options选项卡 ==> 选择Advanced选单里的Advanced Compiler Options ==> 点右边的 ... 按钮,调出输入窗口==> 输入编译选项就ok了。

  1. |

    想问一下as为什么需要条件编译呢,什么情况下需要用到啊

  2. | |

    @jim
    比如说你可以设置两个预编译器, debugging 和 release 然后都写在同一个程序里,
    然后你测试的时候就设置debugging = true ,release = false,很多测试信息都可以看到了,
    正式发布的时候就设置debugging = false, release = true, 那些测试信息就不会编译到swf里了,

    当然你可以在做多平台开发,或者 多版本开发时用, :roll:
    比如说 我做个程序,要在 AIR 里能用 也要在web上用,但是是同一个程序,
    既然是同一个就会有很多相同的代码,只有少数不用的代码,然后就用条件编译来区分这些不同的代码 ;-)

  3. |

    谢谢,以前遇到过这样的问题,只能是分成两个类,很不方便,现在好了,这样也方便管理。thanks :grin:

  4. | |

    @jim
    呵呵,其实这个东东,很早就有了,一直没用,前几天突然想用,就找来,翻译了下,也方便大家用 :grin:

  5. | |

    博主你好,请教一个问题,String型和表达式型的条件编译命令如何使用的?

  6. | |

    @胡林
    String 型,就把他看成是一个常量可以在就好了,
    表达式最终也是装换成一个常量的

  1. Pingback: ASC2.0优化
回到顶部