Conditional Compilation
Conditional compilation directives are typically used to make source programs easy to change and easy to compile in different execution environments. The mikroC PRO for dsPIC30/33 and PIC24 supports conditional compilation by replacing the appropriate source-code lines with a blank line.
All conditional compilation directives must be completed in the source or include file in which they have begun.
Directives #if, #elif, #else, and #endif
The conditional directives #if
, #elif
, #else
, and #endif
work very similar to the common C conditional statements. If the expression you write after #if
has a nonzero value, the line group immediately following the #if
directive is retained in the translation unit.
The syntax is:
#if constant_expression_1 <section_1> [#elif constant_expression_2 <section_2>] ... [#elif constant_expression_n <section_n>] [#else <final_section>] #endif
Each #if
directive in a source file must be matched by a closing #endif
directive. Any number of #elif
directives can appear between #if
and #endif
directives, but at most one #else
directive is allowed. The #else
directive, if present, must be the last directive before #endif
.
sections
can be any program text that has meaning to compiler or preprocessor. The preprocessor selects a single section
by evaluating constant_expression
following each #if
or #elif
directive until it finds a true (nonzero) constant expression. The constant expressions are subject to macro expansion.
If all occurrences of constant-expression are false, or if no #elif
directives appear, the preprocessor selects the text block after the #else clause. If the #else
clause is omitted and all instances of constant_expression
in the #if
block are false, no section
is selected for further processing.
Any processed section can contain further conditional clauses, nested to any depth. Each nested #else
, #elif
, or #endif
directive belongs to the closest preceding the #if
directive.
The net result of the preceding scenario is that only one code section
(possibly empty) will be compiled.
Directives #ifdef and #ifndef
The #ifdef
and #ifndef
directives can be used anywhere #if
can be used and they can test whether an identifier is currently defined or not. The line
#ifdef identifier
has exactly the same effect as #if 1
if identifier
is currently defined, and the same effect as #if 0
if identifier
is currently undefined. The other directive, #ifndef
, tests true for the “not-defined” condition, producing the opposite results.
The syntax thereafter follows that of #if
, #elif
, #else
, and #endif
.
An identifier defined as NULL
is considered to be defined.
What do you think about this topic ? Send us feedback!