Conditional compilation "else"

While Patrick's answer fulfills the question's criteria, it does not cover all use cases. If you are in an area of code that allows you to use an if/else statement then this is a good answer. But if you are in a place where you cannot then you will need a better solution. For example, you may want to do something like this to declare a constant in a class:

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

or for a live release:

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

(this is an example and I'm not advocating this as production code).

I use xml configs and use the loadConfig+="myconfig.xml" to do my configuration instead of passing large numbers of command line params. So in the <compiler> section of your xml config:

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

This works well for all use cases:

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

This has the additional benefit of working consistently across applications. It also does not rely on the 'optimize' flag being true, like Patrick's answer (although I think we can assume that 99.999999% of all swfs have optimize=true, I only set it to false when the optimizer breaks my AS3).

It does have the drawback that it doesn't compile all code paths, just the ones that are included. So if you're not using a build server to create release builds and tell you when things break, be prepared for surprise errors when you do your release build ("But it compiled in debug! Crap, I need this to launch now!").


This works fine and will strip out code that won't run:

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

BUT this will be evaluated at runtime:

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

mxmlc apparently can only evaluate a literal Boolean, and not any kind of expression, including a simple not.


Use the if / else construct : the dead code will be removed by the compiler and it will not be tested at runtime. You will have only one version of your code in your swf.

If you are not sure use a decompiler or a dump tool to see what really happens.

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

http://www.swftools.org/

...