Many programming languages feature a preprocessor that processes macros, allows conditional compilation based on certain criteria, etc.
XC=BASIC doesn't have a preprocessor, but you can use a third-party (generic) preprocessor as part of your toolchain.
This guide guide advises using GPP, a general-purpose preprocessor.
To run GPP before the input is passed to XC=BASIC, you can use piping:
gpp -n source.bas | xcbasic3 /dev/stdin result.prg
What it does is call GPP first, then pass its output to XC=BASIC that does the rest.
The simplest example is defining a macro and creating a conditional block:
REM #define TARGET c64 REM #ifeq TARGET plus4 CONST BGCOLOR = $FF15 REM #else CONST BGCOLOR = $D021 REM #endif POKE BGCOLOR, 0
Note
To make code more readable and not to confuse your syntax highlighter, is it advised that you put preprocessor metacommands in XC=BASIC comments, like in the example above.