条件编译"其他"

tak*_*eek 28 apache-flex flash actionscript-3

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

-define+=CONFIG::DEBUG,true
Run Code Online (Sandbox Code Playgroud)

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

CONFIG::DEBUG {
   trace("This only gets compiled when debug is true.");
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找类似#ifndef的东西,所以我可以否定调试的价值并使用它来有条件地添加发布代码.我发现的唯一的解决办法,到目前为止是在条件编译文档的Adobe和因为我的调试和发布配置是相互排斥的,我不喜欢同时具有DEBUG的想法和释放常数.

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

if (CONFIG::DEBUG) {
   //debug stuff
}
else {
   //release stuff
}
Run Code Online (Sandbox Code Playgroud)

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

-define+=CONFIG::DEBUG,true -define+=CONFIG::RELEASE,!CONFIG::DEBUG
Run Code Online (Sandbox Code Playgroud)

提前致谢 :)

Pet*_*all 22

这工作正常,将删除不会运行的代码:

if (CONFIG::DEBUG) {
   //debug stuff
}
else {
   //release stuff
}
Run Code Online (Sandbox Code Playgroud)

这样会在运行时进行评估:

if (!CONFIG::DEBUG) {
   //release stuff
}
else {
   //debug stuff
}
Run Code Online (Sandbox Code Playgroud)

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


Pat*_*ick 8

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

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

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

http://www.swftools.org/

...

  • -1.*if/else*构造不起作用.简单的测试来证明它:[嵌入]这样的if/else块中的重文件.如果输出文件大小相应地改变,那么它可以工作,否则它不会.此类if/else块在函数外部使用时会产生语法错误,从而得出代码块不会被剥离的结论! (3认同)

Chr*_*ill 6

虽然帕特里克的回答符合问题的标准,但并未涵盖所有用例。如果您所在的代码区域允许您使用 if/else 语句,那么这是一个很好的答案。但是,如果您身处无法做到的地方,那么您将需要更好的解决方案。例如,你可能想要做这样的事情来声明一个类中的常量:

private var server:String = "http://localhost/mystagingenvironment";
Run Code Online (Sandbox Code Playgroud)

或现场发布:

private var server:String = "http://productionserver.com";
Run Code Online (Sandbox Code Playgroud)

(这是一个示例,我不提倡将其作为生产代码)。

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

<define>
    <name>CONFIG::debug</name>
    <value>false</value>
  </define>
<define>
    <name>CONFIG::release</name>
    <value>!CONFIG::debug</value>
</define>
Run Code Online (Sandbox Code Playgroud)

这适用于所有用例:

CONFIG::debug
{
    private var server:String = "http://localhost/mystagingenvironment";
}
CONFIG::release
{
    private var server:String = "http://productionserver.com";
}
Run Code Online (Sandbox Code Playgroud)

这具有跨应用程序一致工作的额外好处。它也不依赖于“优化”标志为真,就像帕特里克的回答一样(尽管我认为我们可以假设 99.999999% 的 swfs 都具有优化 = 真,我只在优化器破坏我的 AS3 时将它设置为假)。

它的缺点是它不编译所有代码路径,只编译包含的那些。因此,如果您没有使用构建服务器来创建发布构建并在出现问题时告诉您,那么在您进行发布构建时要为意外错误做好准备(“但它是在调试中编译的!糟糕,我现在需要它来启动!” )。