Conditional Compilation In C: #if #elif #else #endif

In this video tutorial lets learn about preprocessor command or directives like #if, #elif, #else and #endif. These directives are used in conditional compilation.

Related Read:
Logical Operators In C
Conditional Compilation In C: #ifdef #else #endif

How Does #if and #elif Work?

The block of code inside #if block works only if the condition or the expression in resolved to non-zero number. If the expression is resolved to zero, then the code inside #if is skipped from compilation.

Same is true for #elif: If the condition or the expression is resolved to 0 then the code inside #elif block is skipped from compilation. If it’s resolved to non-zero number then the block of code inside #elif gets compiled and executed.

#else is optional and when used, it should be present only once between #if and #endif, and it should be present at the end(just before the #endif directive). If none of the conditions in #if and #elif match, then the code inside #else directive block gets executed.

#elif is also optional. But it can be used any number of times inside #if and #endif. But it should always be written after #if and not before it. It should be present before #else and not after #else directive.

Note: We can have nested #if #elif #else #endif inside #if and/or #elif and/or #else block. Nesting can go any number or depth.
But remember to have #endif for every #if.

Video Tutorial: Conditional Compilation In C: #if #elif #else #endif



YouTube Link: https://www.youtube.com/watch?v=0s-y4WADkf0 [Watch the Video In Full Screen.]

When To Use #if, #elif, #else and #endif?

1. When you want certain code to be skipped: #if or #elif or #else part of the code is compiled and executed only when the conditions are met.

2. To write portable code: Again, like that of in #ifdef and #else, we could write portable code. That is, we can write code for specific devices in #if, #elif and #else part and the compiler compiles the code specific to that device. All other code will be treated as comments.

3. Saving memory and file size: We could use it in big projects. We could include device specific files inside #if, #elif and #else blocks depending upon the condition. This way we could avoid including or importing all the files into our source code.

#include<stdio.h>

int main()
{
    #if MARKS
        printf("GRADE A\n");
    #endif // MARKS

    printf("Your Result\n");

    return 0;
}

Output:
Your Result

Here macro template is not even defined. And for #if to resolve and print the code inside its block, MARKS should be evaluated to non-zero number.

#include<stdio.h>

#define MARKS

int main()
{
    #if MARKS
        printf("GRADE A\n");
    #endif // MARKS

    printf("Your Result\n");

    return 0;
}

Output:
Your Result

Here even though MARKS is defined, it doesn’t have a non-zero value, so the code inside #if block isn’t compiled.

#include<stdio.h>

#define MARKS 50

int main()
{
    #if MARKS
        printf("GRADE A\n");
    #endif // MARKS

    printf("Your Result\n");

    return 0;
}

Output:
GRADE A
Your Result

Here MARKS has a macro expansion as 50, which not zero, so code inside #if gets compiled and executed.

Using logical operatation

#include<stdio.h>

#define MARKS 50

int main()
{
    #if(MARKS <= 100 && MARKS >= 80)
        printf("GRADE A\n");
    #endif // MARKS

    printf("Your Result\n");

    return 0;
}

Output:
GRADE A
Your Result

Check the condition for #if. We can use logical operator and/or arithmetic operators and/or relational operators and/or Conditional Operators in the condition.

Nesting of Directives

#include<stdio.h>

#define MARKS 50

int main()
{
    #if(MARKS <= 100)
        printf("GRADE A\n");
        #if(MARKS >= 80)
            printf("You're excellent!\n");
        #else
            printf("You're not that excellent yet!\n");
        #endif
    #endif // MARKS

    printf("Your Result\n");

    return 0;
}

Output:
GRADE A
You’re not that excellent yet!
Your Result

We can nest any number of #if #endif and/or #if #else #endif and/or #if #elif #endif and/or #if #elif #else #endif inside #if and/or #elif and/or #else.

Source Code: Conditional Compilation In C: #if #elif #else #endif

#include<stdio.h>

#define MARKS 50

int main()
{
    #if(MARKS <= 100 && MARKS >= 80)
        printf("GRADE A\n");
    #elif(MARKS <= 79 && MARKS >= 60)
        printf("GRADE B\n");
    #elif(MARKS <= 59 && MARKS >= 40)
        printf("GRADE C\n");
    #elif(MARKS <= 39 && MARKS >= 30)
        printf("GRADE D\n");
    #else
        printf("Please retake the test!\n");
    #endif // MARKS

    printf("Your Result\n");

    return 0;
}

Output:
GRADE C
Your Result

Only 1 block of code is compiled and executed here, even if multiple conditions are satisfying. Whichever condition returns non-zero number first, the code inside its block gets executed. All other code will be skipped.

For list of all c programming interviews / viva question and answers visit: C Programming Interview / Viva Q&A List

For full C programming language free video tutorial list visit:C Programming: Beginner To Advance To Expert