首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条件编译"else“

条件编译"else“
EN

Stack Overflow用户
提问于 2010-04-29 18:10:28
回答 4查看 8.9K关注 0票数 28

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

代码语言:javascript
复制
-define+=CONFIG::DEBUG,true

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

代码语言:javascript
复制
CONFIG::DEBUG {
   trace("This only gets compiled when debug is true.");
}

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

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

代码语言:javascript
复制
if (CONFIG::DEBUG) {
   //debug stuff
}
else {
   //release stuff
}

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

代码语言:javascript
复制
-define+=CONFIG::DEBUG,true -define+=CONFIG::RELEASE,!CONFIG::DEBUG

提前感谢:)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-04-29 19:49:52

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

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

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

http://www.swftools.org/

..。

票数 8
EN

Stack Overflow用户

发布于 2010-11-01 23:25:37

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

代码语言:javascript
复制
if (CONFIG::DEBUG) {
   //debug stuff
}
else {
   //release stuff
}

这将在运行时求值:

代码语言:javascript
复制
if (!CONFIG::DEBUG) {
   //release stuff
}
else {
   //debug stuff
}

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

票数 22
EN

Stack Overflow用户

发布于 2012-06-28 06:18:48

虽然Patrick的答案满足问题的标准,但它并不涵盖所有用例。如果您所在的代码区域允许使用if/else语句,那么这是一个很好的答案。但是如果你在一个你不能做到的地方,那么你将需要一个更好的解决方案。例如,您可能希望这样做,以便在类中声明一个常量:

代码语言:javascript
复制
private var server:String = "http://localhost/mystagingenvironment";

或者对于一个实时发布:

代码语言:javascript
复制
private var server:String = "http://productionserver.com";

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

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

代码语言:javascript
复制
<define>
    <name>CONFIG::debug</name>
    <value>false</value>
  </define>
<define>
    <name>CONFIG::release</name>
    <value>!CONFIG::debug</value>
</define>

这对于所有用例都很有效:

代码语言:javascript
复制
CONFIG::debug
{
    private var server:String = "http://localhost/mystagingenvironment";
}
CONFIG::release
{
    private var server:String = "http://productionserver.com";
}

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

它确实有一个缺点,那就是它不会编译所有的代码路径,只编译包含的那些代码路径。因此,如果你没有使用构建服务器来创建发布构建,并在事情崩溃的时候告诉你,那么在你进行发布构建时,要为意外的错误做好准备(“但是它是在debug中编译的!废话,我需要现在就启动它!”)。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2736411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档