条件编译“Else”

6yoyoihd  于 2022-09-21  发布在  Apache
关注(0)|答案(4)|浏览(164)

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

-define+=CONFIG::DEBUG,true

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

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

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

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

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

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

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

提前感谢:)

eqoofvh9

eqoofvh91#

这可以很好地工作,并且会去掉不能运行的代码:

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

这将在运行时计算:

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

Mxmlc显然只能计算文字布尔值,而不能计算任何类型的表达式,包括简单的NOT

ldxq2e6h

ldxq2e6h2#

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

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

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

http://www.swftools.org/

..。

7jmck4yq

7jmck4yq3#

虽然Patrick的答案满足问题的标准,但它并不涵盖所有用例。如果您所在的代码区域允许您使用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";
}

这还有一个额外的好处,即跨应用程序一致地工作。它也不像帕特里克的答案那样依赖于‘OPTIMIZE’标志为真(尽管我认为我们可以假设所有SWF中有99.999999的OPTIMIZE=TRUE,我只在优化器破坏我的AS3时才将其设置为FALSE)。

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

d6kp6zgx

d6kp6zgx4#

我对Chris Hill的回答(这也是我经常使用的解决方案)只有两点看法:似乎使用loadConfig+="myconfig.xml"选项使编译器在Flex SDK目录中搜索myconfig.xml文件,而-load-config+=myconfig.xml选项使其在项目目录中搜索myconfig.xml文件,这是我强烈喜欢的行为,因为这样您就可以很容易地将该文件与项目源代码一起分发……

相关问题