Often in classrooms we are taught that the main function is the ‘main’ function in a program! But it actually is not so. That is actually the default behavior of the compiler. The compiler has a predefined set of rules according to which ::
1. The main() function has a default
priority of 0, which is the highest.
2. Priorities from 0 to 63 are reserved for use by C libraries.
3. Priorities from 64 o 99 are kept as a second reserve if the number of library function in a code exceeds 63.
4. Any user defined function starts with a priority of 100.
5. The maximum explicitly defined priority can be 254.
Thus it is obvious that the main() works with the highest priority at a program startup.
But the c language provides for a scope of changing the priority such that main() has a priority shift from startup to exit, i.e.; it has a higher priority on exit than on startup. This can exactly be done with the #pragma directive. The #pragma can help us to set priorities of out user defined functions, at startup as well at exit.
In this code I have implemented the #pragma directive to create a function ‘disp_start()’ which has a higher priority of 60 than main(), whose priority has been lowered from 0 to 70.
Code:
#include<iostream .h>
# include <stdio .h>
#include<conio .h>
void disp_start();
void main();
void disp_end();
#pragma startup main 70
#pragma startup disp_start 60
#pragma exit disp_end
static int a=1;
void disp_start()
{
FILE *fp=fopen("nomain.cpp","r");
char c=‘a’;
while(c!=EOF)
{
putch(c=fgetc(fp));
}
fclose(fp);
cout< <"\n\nStarting first priority function\n";
cout<<"Value of X is initially "<<a; a++;
cout<<"\nEnd of start()….\n";
cout<<"Value of X now is "<<a;
}
void main()
{
cout<<"\n\nEntering main()\n";
cout<<"Value of X is initially "<<a; a++;
cout<<"\nEnd of main()….\n";
cout<<"Value of X now is "<<a;
}
void disp_end()
{
cout<<"\n\nEntering exit priority function\n";
cout<<"Value of X is initially "<<a; a++;
cout<<"\nEnd of exit()….";
cout<<"\nValue of X now is "<<a;
cout<<"\n\n\t\tALL CALLS TRACED…";
}
As the calls proceed and the static variable is updated, you can see the procedure for live.