Dan,
Let me try to explain.
I have a commercial product which does data entry and data processing for a niche market. Originally written in the 1980's in FORTRAN 66 for microprocessor systems (CP/M to start, then on to MS-DOS, and beyond), the program now utilizes about 80 labeled common blocks, and has over 300 subroutines/functions that perform a wide variety of functions, from data entry through coordinate datum transformations. Many of data variables in COMMON must be set to an initial value to allow the code to establish the initial conditions properly. Since I don't know what the user might want to start with first, all data has to have a predictable initial condition. Simple.
Since FTN95 does not automatically initialize all data to zeroes in labeled common (the old CP/M and MS-DOS FORTRAN compiler/linker did exactly this), one has two options. First is to execute code to initialize, variable by variable, the COMMON, or second, to use a DATA statement to initialize these data. The latter is more efficient, since the data are pre-loaded at run-time. Also, separate program executables might require more or fewer COMMON's to be initialized. So, executing code to do this requires multiple 'variants' to initialize the required data.
One can do this the 'normal way' using a BLOCK DATA sub-program. In the old days, BLOCK DATA was the only way data could be initialized in labeled COMMON. FTN95 does not have this restriction. But if you use it, you have other restrictions.
Which takes one to the maintenance of the initialization data. Does one like to edit two files when adding a variable, or perhaps add an all new COMMON block? One file for the COMMON and variable declarations, and the other for the BLOCK DATA and the initializations? No, having a single file that can be used for both purposes would be preferable. Not required, just preferable.
Enter conditional compilation, something that 'C' compilers (and others) have also had for a long time. FTN95's implementation is quite adequate for many tasks. I'll stick with this one task for right now.
By placing conditional compilation elements into the INCLUDE'd file, I can control whether or not a particular section of code gets compiled or not. In this case, the control is whether or not to compile the data initialization.
If I choose to set the conditional compilation variable to a DEFINE'd state, then the compiler will compile the DATA statements, thus initializing the labeled COMMON. But, one only wants to do this one time. If one does this more than once, then the linker will fail with a multiply defined symbol error. Try it. These errors are actually hard to find when ten's of variables are involved across multiple compiled units.
So, I've chosen to use BLOCK DATA, and to INCLUDE the variables, COMMON block declarations, and DATA initializations with the DATA initializations 'turned on' for compilation by using conditional compilation.
If your programs are not structured to use labeled COMMON, and/or you do not need to have data pre-initialized via BLOCK DATA (or any DATA statements), then none of this will matter to you, or will it have any meaning.
It does in my situation, and others may also have a need to solve a similar problem.
Or, one may want to do, with conditional compilation, something a bit more intriguing. In my case, creating an evaluation version of the software package. I chose to limit the evaluation version to a specific number of various entities that can be created, edited, or displayed. By using conditional compilation, I change the array sizes and PARAMETER limits that control how the software interacts with the user.
So, with minimal changes to the code (also controlled by conditional compilation), I can create this evaluation version. Same program modules, same INCLUDE files, just slightly different settings.
I hope this helps your understanding of my process and solutions.
Bill