条件编译“其他”

时间:2010-04-29 10:10:28

标签: flex flash actionscript-3

在AS3中,您可以将常量传递给编译器

-define+=CONFIG::DEBUG,true

并将其用于条件编译,如下所示:

CONFIG::DEBUG {
   trace("This only gets compiled when debug is true.");
}

我正在寻找像#ifndef这样的东西,所以我可以否定调试的价值并使用它来有条件地添加发布代码。到目前为止,我发现的唯一解决方案是在adobe的conditional compilation documentation中,因为我的调试和发布配置是互斥的,所以我不喜欢同时使用DEBUG和RELEASE常量。

此外,这种格式有效,但我假设它在运行时运行检查,这不是我想要的:

if (CONFIG::DEBUG) {
   //debug stuff
}
else {
   //release stuff
}

我也考虑过做这样的事情,但它仍然不是我希望的优雅解决方案:

-define+=CONFIG::DEBUG,true -define+=CONFIG::RELEASE,!CONFIG::DEBUG

提前致谢:)

4 个答案:

答案 0 :(得分:22)

这样可以正常工作并删除不会运行的代码:

if (CONFIG::DEBUG) {
   //debug stuff
}
else {
   //release stuff
}

但是这将在运行时进行评估:

if (!CONFIG::DEBUG) {
   //release stuff
}
else {
   //debug stuff
}

mxmlc显然只能评估文字布尔值,而不能评估任何类型的表达式,包括简单的而不是

答案 1 :(得分:8)

使用if / else构造:死代码将被编译器删除,并且不会在运行时进行测试。您的swf中只有一个版本的代码。

如果您不确定使用反编译器或转储工具来查看实际发生的情况。

http://apparat.googlecode.com/files/dump.zip

http://www.swftools.org/

...

答案 2 :(得分:4)

虽然帕特里克的答案符合问题的标准,但它并未涵盖所有用例。如果您所在的代码区域允许您使用if / else语句,那么这是一个很好的答案。但是,如果你所在的地方你不能,那么你将需要一个更好的解决方案。例如,您可能希望执行类似的操作来在类中声明常量:

private var server:String = "http://localhost/mystagingenvironment";

或实时发布:

private var server:String = "http://productionserver.com";

(这是一个例子,我不是把它作为生产代码提倡的。)

我使用xml配置并使用loadConfig + =“myconfig.xml”来进行配置,而不是传递大量的命令行参数。所以在你的xml配置的<compiler>部分:

<define>
    <name>CONFIG::debug</name>
    <value>false</value>
  </define>
<define>
    <name>CONFIG::release</name>
    <value>!CONFIG::debug</value>
</define>

这适用于所有用例:

CONFIG::debug
{
    private var server:String = "http://localhost/mystagingenvironment";
}
CONFIG::release
{
    private var server:String = "http://productionserver.com";
}

这具有跨应用程序一致工作的额外好处。它也不依赖于'优化'标志是真的,就像Patrick的答案一样(尽管我认为我们可以假设所有swfs的99.999999%都有optimize = true,我只在优化器破坏我的AS3时将其设置为false)。

它的缺点是它不能编译所有代码路径,只包括所包含的代码路径。因此,如果您没有使用构建服务器来创建发布版本并告诉您何时中断,请在执行发布版本时为出现意外错误做好准备(“但它在调试中编译!Crap,我现在需要启动它!” )。

答案 3 :(得分:0)

关于Chris Hill的回答(这也是我经常使用的解决方案)的两分钱:似乎使用loadConfig + =“myconfig.xml”选项使编译器在Flex SDK目录中搜索myconfig.xml文件而-load-config + = myconfig.xml选项使它在项目目录中搜索myconfig.xml文件,这是我非常喜欢的行为,因为您可以使用项目源轻松分发此文件...