FPT and WinFPT Reference Manual - Command-line Commands

| SimCon Home | Reference Manual Home |




cpp in Fortran

Some Fortran codes must be pre-processed before they can be built. Pre-processing is carried out, for example, to select facilities supported by some but not all compilers, or to configure the code for different parallel configurations. The most widely used pre-processor is the C pre-processor, cpp. cpp is usually used to process free format Fortran code. cpp changes the code layout, and this may disrupt the organisation of fixed format code.

The fpt implementation of cpp

WinFPT and fpt handle cpp macros and constructs in the same way as cpp itself, with the following exceptions:

fpt processes the cpp macros and commands and then analyses and re-engineers the resulting Fortran code. Therefore fpt cannot analyse and re-engineer the unused branches of #if constructs. These are reproduced as text exactly as they are written in the original code. Operatons like rename symbol must therefore be used with care when cpp contructs are present.

Function of the Commands:

HIDE CPP commands fpt to analyse and re-engineer the Fortran code generated from the cpp commands, but to re-write the code with the commands and macros in place. The code produced may therefore be built by the original build procedure for the program, with the cpp operations unchanged. Care must be taken to avoid unexpected side effects from renumbering labels, renaming variables and changing file names.

EMULATE CPP commands fpt to write the code which would be generated by cpp. Any engineering changes made by fpt, and any diagnostic messages, are also written in the output files. This code is expected to be fully compilable. The cpp commands are removed and processing by cpp is no longer necessary in the build. However it is not possible to rebuild with different cpp options. This command is particularly useful when code is inspected interactively. It is possible to toggle between the three cpp handling options in interactive mode.

SHOW CPP commands fpt to show both the macros and the macro expansions in the code. Any engineering changes made by fpt, and any diagnostic messages, are also written in the output. This code will not compile. The facility is useful when code is examined interactively.

The command SHOW CPP MACROS displays and alphabetical list of the cpp macros defined in the program.

Where to use these commands:

Operating system command line


Configuration file, config.fsp


Specification (FSP) files, *.fsp


Interactively, to FPT> prompt:


Interactive command files


Embedded in the Fortran code





The same code fragment is displayed interactively with the three different cpp command settings:

FPT>  hide cpp
FPT>  type 21
   14   !
   15   #define FTYPE yield
   16   #define ROUTINE set_components
   17           CALL ROUTINE(FTYPE%name,val_name,FTYPE%value,val_val, &
   18            FTYPE%description,val_description)
   19   #undef ROUTINE
   20   !
   21 >>#define ROUTINE get_components
   22           CALL ROUTINE(FTYPE%name,val_name,FTYPE%value,val_val, &
   23            FTYPE%description,val_description)
   24   #undef ROUTINE
   25   !
   26   #define ROUTINE show_components
   27           CALL ROUTINE(FTYPE%name,val_name,FTYPE%value,val_val, &
   28            FTYPE%description,val_description)
   29   #undef ROUTINE
FPT>  emulate cpp
FPT>  type 21
   14   !
   17           CALL set_components(yield%name,val_name,yield%value,val_val, &
   18            yield%description,val_description)
   20   !
   21 >>
   22           CALL get_components(yield%name,val_name,yield%value,val_val, &
   23            yield%description,val_description)
   25   !
   27           CALL show_components(yield%name,val_name,yield%value,val_val, &
   28            yield%description,val_description)
   29   !
FPT>  show cpp
FPT>  type 21
   14   !
   15   !CPP! #define FTYPE yield
   16   !CPP! #define ROUTINE set_components
   17           CALL ROUTINE << set_components >>  (FTYPE << yield >> %name, &
   18            val_name,FTYPE << yield >>  %value,val_val,FTYPE << yield >> % &
   18            description,val_description)
   19   !CPP! #undef ROUTINE
   20   !
   21 >>!CPP! #define ROUTINE get_components
   22           CALL ROUTINE << get_components >> (FTYPE << yield >> %name, &
   23            val_name,FTYPE << yield >> %value,val_val,FTYPE << yield >> % &
   23            description,val_description)
   24   !CPP! #undef ROUTINE
   25   !
   26   !CPP! #define ROUTINE show_components
   27           CALL ROUTINE << show_components >> (FTYPE << yield >> %name, &
   28            val_name,FTYPE << yield >> %value,val_val,FTYPE << yield >> % &
   28            description,val_description)
   29   !CPP! #undef ROUTINE

Copyright ©1995 to 2014 Software Validation Ltd. All rights reserved.