Powered by QM on a Rpi server
About OpenQM
Sales and Downloads
Help and Support

KnowledgeBase 00083: Conditional Compilation

Last updated: 22 Jul 2016
Applies to: All versions
Top level index       Full Index Search Tips
Previous article     Next article

This article was originally published as a Tip of the Week.


Application developers sometimes need to write programs that can be compiled on different multivalue systems where there may be syntactic or semantic variations in how a source line will be handled. Several multivalue products, but unfortunately not all, provide compiler directives that allow conditional compilation.

For those products that do not provide this as a built-in part of the multivalue Basic language, QM includes the source code for a pre-processor named PREPROC in the BP file of the QMSYS account which should itself compile on most systems without modification.

The $IFDEF Compiler Directive

Conditional compilation is controlled by use of the $IFDEF directive.

   $IFDEF name
In this example, the statements under the $IFDEF line will be compiled only if name has been defined using $DEFINE, EQUATE or via the $BASIC.OPTIONS record.

The $ELSE element is optional. If present, the statements under the $ELSE line will be compiled only if name has not been defined.

There is also a $IFNDEF that inverts the condition, compiling the lines under the $IFNDEF if name is not defined and those under the $ELSE if it is defined.

More complex conditions can be constructed using AND or OR (or their symbolic variants & and !) to form a compound expression that is evaluated left to right. This ability is present in the QMBasic compiler but not in the pre-processor prior to release 3.0-3.

Conditional compilation constructs can be nested to any depth though excessive nesting can make programs difficult to read.

Standard Defined Names

When compiling programs on QM, the name "QM" is always defined. Thus a program might include a section that reads

      N = DCOUNT(STATE, @VM) 
      FOR I = 1 to N 
         STATE<I> + STATE.TEXT<POS> 
      NEXT I 

Although they should rarely be needed because compiled programs are portable across all platforms on QM, there are also platform specific names defined such as QM.LINUX, QM.WINDOWS, QM.MAC, etc. Note that these are dependent on where the program is compiled, not the platform on which it is executed (which can be determined using the SYSTEM(1010) function).


The ability to use conditional compilation is particularly valuable while migrating to QM as it allows any changes needed to application prorgams to be included in the same source code that is used for the previous platform, thus removing the need to continually apply developments to two source streams.

Related Articles


00082: Setting QMBasic Compiler Options

Please tell us if this article was helpful
Very     Slightly     Not at all
Email (optional)