Conditional Compilation in R/BASIC

Published ByDateVersionKnowledge LevelKeywords
Revelation Technologies23 APR 19922.1XEXPERTCOMPILER, COMPILE, RBASIC, #DEFINE, #UNDEFINE, IFDEF, IFNDEF

In Advanced Revelation 2.12 the R/BASIC compiler, RTP5, supports conditional compilation. This bulletin describes how you use conditional compilation in your programs.

Note: Careful use of conditional compilation can make it easy to use the same program in a variety of slightly different situations. Overuse of the feature can lead to programs that are difficult to read and maintain.

When your program is compiled, the source code is first passed through two preprocessors. The first, the IFDEF preprocessor, is the one described here. The second strips out comments and extra whitespace.

The IFDEF preprocessor looks for special words in your code and, depending on the action indicated, turns additional lines into comments. The comments can then been stripped by the second preprocessor.

IFDEF supports five directives. Each directive must appear on a line by itself and must be preceded by a #.

  • The value of label can be any alphanumeric string.
  • Spaces are not allowed.

DEFINE designates a label that subsequent IFDEF and IFNDEF commands look for. IFDEF and IFNDEF branch based on whether or not a label is defined. You can define more than one label.

#DEFINE VERSION212
#DEFINE DEVELOPER

UNDEFINE is used to stop tracking a label. You use this to turn off checking.

#UNDEFINE VERSION212

Use IFDEF to indicate that the following lines should be compiled only if the label is defined. If the label is not defined, the lines are not compiled.

#IFDEF VERSION212
  MSG(This is version 2.12)
#ENDIF

Use IFNDEF to indicate that the following lines should be compiled only if the label is not defined.

#IFNDEF VERSION212
  MSG("This isn't version 2.12",'','','')
#ENDIF

ENDIF identifies the end of the block of code to compile conditionally.

Figures 1 and 2 show how the directives can be used in programs.

The DEFINE directive is currently supported only in the source code. A future release of Advanced Revelation will allow you to set your DEFINEs from the command line by using the COMPILE command.

Figure 1

/* Define a switch to be used when debugging the program */
/* Comment out the following line when debugging is complete */
#DEFINE DEBUG

CNTR = 1
LOOP
  CNTR += 1
UNTIL CNTR > 100
  /* Processing here */
  #IFDEF DEBUG
    MSG('CNTR = %1%','','',CNTR)
    DEBUG
  #ENDIF
REPEAT

Figure 2

/* This program shows how the IFDEF processor might be used to support
customers in the field using multiple versions of Advanced Revelation.
It assumes that the program is being *compiled* under version 2.12 */

DECLARE SUBROUTINE MSG,FSMSG

#DEFINE 212 ;* Comment out this line when compiling for non-2.12 customers

EQU TRUE$  TO 1
EQU FALSE$ TO 0

TABLENAME = 'SAMPLE_CUSTOMERS'
OPEN TABLENAME TO REPORT_TABLE ELSE FSMSG()
  STOP
END

SELECT REPORT_TABLE
DONE = FALSE$
LOOP
  READNEXT KEY ELSE
    DONE = TRUE$
  END
UNTIL DONE
  READ RECORD FROM REPORT_TABLE, KEY THEN
    COMPANY = RECORD<1>
    #IFDEF 212
      MAP = 'T1'
      MAP<5> = '@@EW' ;* Blinking border
      MSG(COMPANY, MAP,'','')
    #ENDIF
    #IFNDEF 212
      MSG(COMPANY,T1,'','')
    #ENDIF
  END
REPEAT
  • tips/revmedia/r109.txt
  • Last modified: 2024/06/19 20:20
  • by 127.0.0.1