Conditonal compilation and detecting .NET at runtime
For an introduction to conditional compilation see
Conditional compilation.
FTN95 uses IS_CLR@ in two different contexts.
1) As a macro in conditional compilation, and
2) as the name of an intrinsic function.
In both cases IS_CLR@ returns TRUE only if it is a .NET program
(i.e. /CLR is on the command line).
Here is an example of its use in conditional compilation:
CIF (IS_CLR@)
OBJECT('System.Int32') :: j
CELSE
INTEGER :: j
CENDIF
Note that the FTN95 option /FPP is only required for a Win32
platform (when /CLR is not present, because it is implied by /CLR). /SPARAM
and /VPARAM can be used for .NET but /SPARAM cannot be used
to set the value of IS_CLR@.
Here is an example of the use of IS_CLR@ at runtime:
IF (IS_CLR@()) PRINT *, 'Running under .NET'
The compiler will issue a warning that the test will always or never
succeed. This can be ignored.
The pre-processor can use .AND. and .OR. in very simple expressions.
Note that .AND. and .OR. have equal precedence and that brackets cannot be
used to group expressions. You must use a comparison if .AND. or .OR. are used.
Thus the directive:
CIF (IS_CLR@ .AND. KIND == 3)
will produce an error and must be written:
CIF (IS_CLR@ == 1 .AND. KIND == 3)
Note also that continuations are ignored by the
pre-processor. However, it does not truncate lines.
The pre-processor also supports CELSEIF and CERROR. The CERROR directive
simply prints the given string as a compilation error and halts
compilation. This can be used to trap invalid VPARAM combinations. For
example:
CIF (IS_CLR@ == 1 .AND. KIND == 3)
CERROR '"/VPARAM KIND 3" is not supported under .NET'
CELSEIF (KIND == 3)
INTEGER, PARAMETER :: kind = 3
CENDIF