The C processor is a macro processor which is used to compile the source code of the program (step by step) . It is not a part of the compiler. All pre-processor commands begin with the hash symbol (#).
The C pre-processor provides various facilities that are:
- Inclusion of header
- Macro expansion
- Conditional compilation
- Line control
Preprocessor |
Syntax/Description |
Macro |
Macro is used to define the constant value and data types.
Syntax: #define |
Header file inclusion |
The source code of the file “file_name” is included in the main program at the specified place.
Syntax: #include <file_name> |
Conditional compilation |
It is used to set of commands in source program.
Syntax: #ifdef, #endif, #if, #else, #ifndef |
Other directives |
#undef is used to defined a macro variable and #Pragma is used to call a function before and after main function.
Syntax: #undef, #pragma |
C language, there are various stages of the execution process. The given following diagram will help you:
There are following important pre-processor directories in C language.
Directive |
Description |
#define |
Substitutes a pre-processor macro. |
#include |
It is used to inserts a particular header from another file. |
#undef |
It is used to undefine a preprocessor macro. |
#ifdef |
It is used to return true if this macro is defined. |
#ifdef |
It is used to return if this macro is defined. |
#if |
It is used to check compile time condition. |
#else |
The alternative for #if. |
#elif |
#if and #else in one statement. |
#endif |
It is used to end pre-processor conditional. |
#error |
It is used to print an error message on stderr. |
#pragma |
Issues special command to the compiler, using a standardized method. |
Example: 1
#include<stdio.h>
#include”header.h”;
Example 2
#ifndef MESSAGE
#define MESSAGE “You Wish”
#endif
C Macros
A macro is a name which stands for a fragment of code. Before using macro we must define it with ‘#define’ directive. It is the name of a macro.
There are two types of macros.
- Object-like macros
- Function-like macros
- Object-Like Macros:
The object-like macro is an identifier that is replaced by value. It is widely used to represent numeric constants.
Example:
Pi =3.147
- Function like Macros:
Function like macros is used as a function call. Let us consider an example.
#define Max(a,b)((a)>(b)?(a):(b))
Here MAX is the macro name.
There are some predefined macros :
Predefined Macros |
Description |
_DATE_ |
It is defined as the current date with “MMM DD YYY” format. |
_TIME_ |
It is defined as current time with “HH:MM:SS” format. |
_FILE_ |
It contains the current filename as a string literal. |
_STDC_ |
It is defined as 1 when compiler compiles with the ANSI standard. |
__STDC_VERSION__ |
It is defined as standard’s version |
_GNUC_ |
It is defined if and only if this is GNU C. etc |
Example of Macros
#include <stdio.h>
main(){
printf("File :%s\n",__FILE__);
printf("Date :%s\n",__DATE__);
printf("Time :%s\n",__TIME__);
printf("Line :%d\n",__LINE__);
printf("STDC:%d\n",__STDC__);
}
Output
File :main.c
Date :Apr 24 2019
Time :11:50:39
Line :6
STDC:1
C #define and #include.
C #defined:
It defines constant value. It can be any of the basic data types.
Syntax:
#define token value
Example: 1
#include <stdio.h>
#define PI 3.14
main() {
printf("%f",PI);
}
Output
3.140000
Example:2
#include <stdio.h>
#define number 3.14
#define letter 'A'
#define letter_sequence "C_Tutorial"
#define backslash_char '\?'
void main(){
printf("value of number : %f \n", number );
printf("value of letter : %c \n", letter );
printf("value of letter_sequence : %s \n", letter_sequence);
printf("value of backslash_char : %c \n", backslash_char);
}
Output
value of number : 3.140000
value of letter : A
value of letter_sequence : C_Tutorial
value of backslash_char : ?
#include:
It is used to paste the code of given file into the current file. We can use system-defined and used-defined header files.
There are two types of #include directive.
- #include< filename>
- #include ”filename”
Example
#include<stdio.h>
int main(){
printf("Hello World ");
return 0;
}
Output
Hello World
C #undef:
It is used to check undefined the constant or macro. It is defined by #define.
Syntax:
#undef token
Example 1:
#include <stdio.h>
#define PI 3.14
#undef PI
main() {
printf("%f",PI);
}
Output
Compile time Error: PI undeclared
Example 2:
#include <stdio.h>
#define number 15 // variable define
int squ=number*number;
#undef number
int main() {
printf("%d",squ);
return 0;
}
Output
225
#ifdef, #else and #endif
The
‘#ifdef’ directive is used to check whether the macro is defined or not. If it is defined then, ‘
if’ clause statements are included in the source code.
Otherwise “
else” clause statements are included in the source file for compilation and execution.
Example : #ifdef
#include<stdio.h>
#define AGE 18
void main(){
#ifdef AGE
{
printf("You are Eligible for voting\n");
}
#else
{
printf("Not eligible\n");
}
#endif
}
Output
You are Eligible for voting
C #Pragma:
The C #Pragma is used to call a function before and after the main function. It also provides additional information to the compiler.
There are several types of pragmas in GCC compiler.
- AArch64 Pragmas
- ARM Pragmas
- M32C Pragmas
- MeP Pragmas
- RS/6000 and PowerPC Praglmas
- S/390 Pragmas:
- Darwin Pragmas:
- Solaris Pragmas: etc.
Syntax:
#pragma token
Example:
#include <stdio.h>
void function1( );
void function2( );
#pragma startup fun1
#pragma exit fun2
int main(){
printf ( "\n Now we are in main function" ) ;
return 0;
}
void fun1(){
printf("\nFun1 is called before main function call");
}
void fun2(){
printf ( "\nFun2 is called just before end of main function" ) ;
}
Output
Now we are in main function