Page Stats
Visitor: 757
C - PreProcessor
C - PreProcessor process our source code before it is passed to the compiler. Each preprocessor statement begins with hash '#' symbol.
Directive | Description |
---|---|
#include | Inserts a particular header file in our program. |
#define | Substitutes a preprocessor macro. |
#undef | Undefines a preprocessor macro. |
#ifdef | Returns true if this macro is defined. |
#ifndef | Returns true if this macro is not defined. |
#if | Tests if a compile time condition is true. |
#else | The alternative for #if |
#elif | #else an #if in one statement |
#endif | Ends preprocessor conditional |
#error | Prints error message on stderr |
#pragma | Issues special commands to the compiler, using a standardized method |
#include: The #include preprocessor directive is used to include system-defined and user-defined header files. If included file is not found, compiler renders error.
#define: The #define preprocessor directive is used to define constant or micro. It can use any basic data type.
#define pi 3.14 declare constant variable pi with 3.14 value. #define and && declare && operator with english word and. #define or || declare || operator with english word or.
Macro with Argument: Macro's can have argument just like functions. Syntax to define Macro's with argument is:
#define sum(a,b) a+b declare a macro sum with two arguments to calculate sum of two numbers. #define area(x) 3.14*r*r declare a macro area with one argument and also define its defination in one line. #define sq(a) a*a declare a marcro sq with one argument to calculate square of a number. #define greater(a,b) (a>b)?a:b Input 2 number and find greater #define greater3(a,b,c) (a>b && a>c)?a:(b>a && b>c)?b:c Input 3 number and find greater.
#undef: The #undef preprocessor directive is used to undefine the constant or macro. Syntax:
#undef FILE_SIZE //undefine the macro #define FILE_SIZE 42 //redefine the macro
#ifdef: The #ifdef preprocessor directive checks if macro is defined by #define. If yes, it executes the code otherwise #else code is executed, if present. Syntax:
#define NOINPUT //remove this line and execute code again void main() { int a=0; #ifdef NOINPUT a=2; #else printf("Enter a:"); scanf("%d", &a); #endif printf("Value of a: %d\n", a); getch(); }
#ifndef: The #ifndef preprocessor directive checks if macro is not defined by #define. If yes, it executes the code otherwise #else code is executed, if present. Syntax:
#define INPUT //remove this line and execute code again void main() { int a=0; #ifndef INPUT a=2; #else printf("Enter a:"); scanf("%d", &a); #endif printf("Value of a: %d\n", a); getch(); }
Predefined Macros: ANSI C defines many predefined macros that can be used in c program.
Macro | Description |
---|---|
__DATE__ | The current date as a character literal in "MMM DD YYYY" format | __TIME__ | The current time as a character literal in "HH:MM:SS" format |
__FILE__ | This contains the current filename as a string literal. |
__LINE__ | This contains the current line number as a decimal constant. |
Example: Predefined Macro
void main() { printf("File :%s\n", __FILE__ ); printf("Date :%s\n", __DATE__ ); printf("Time :%s\n", __TIME__ ); printf("Line :%d\n", __LINE__ ); }
#if preprocessor: The #if preprocessor directive evaluates the expression or condition. If condition is true, it executes the code otherwise #elseif or #else or #endif code is executed.
#define NUMBER 1 void main() { #if NUMBER==0 printf("Value of Number is: %d",NUMBER); #else print("Value of Number is non-zero"); #endif getch(); }
#error preprocessor: The #error preprocessor directive indicates error. The compiler gives fatal error if #error directive is found and skips further compilation process.
#include<stdio.h> #ifndef __MATH_H #error First include then compile #else void main() { float a; a=sqrt(7); printf("%f",a); } #endif
[if you include math.h, it does not gives error.]
Miscellaneous Directives
#pragma directive
a) #pragma startup This directive allow us to execute function before main() function. Syntax:
void fun() { printf("Welcome, user"); } #pragma startup fun void main() { printf("\nMain Message"); }
We can use more than one function to be executed at startup but they will be executed in reverse order.
#include<stdio.h> #include<conio.h> void fun1() { printf("\nWelcome, user1"); } void fun2() { printf("\nWelcome, user2"); } #pragma startup fun1 #pragma startup fun2 void main() { printf("\nMain Message"); }
0 = Highest priority
0-63 = Used by C libraries
64 = First available user priority
100 = Default priority
255 = Lowest priority
#include<stdio.h> #include<conio.h> void fun1() { printf("\nWelcome, user1"); } void fun2() { printf("\nWelcome, user2"); } #pragma startup fun1 64 #pragma startup fun2 void main() { clrscr(); printf("\nMain Message"); getch(); }
b) #pragma exit This directive allow us to execute function after main () function.
#include<stdio.h> #include<conio.h> void fun() { printf("Thankyou for using the program"); } #pragma exit fun void main() { clrscr(); printf("\nMain Message"); getch(); }
Both startup and exit functions should neither receive nor return any value.
#pragma warn This directive tells the compiler whether the warning will be shown or not.
a) #pragma warn –rvl return value warning does not display even if return keyword is not used in a function.
b) #pragma warn – par parameter not used warning does not display even if variable not used in a parameter.
c) #pragma warn – rch unreachable code warning does not display even if any code of statement is unreachable.