Conditional Compilation In C: #ifndef #else #endif

In this video tutorial lets learn about preprocessor command or directives like #ifndef, #else and #endif. These directives are used for conditional compilation. #ifndef works completely opposite to #ifdef

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

How Does #ifndef Work?

The block of code between #ifndef and #endif works only if the macro name is NOT defined. If the macro name is defined, the compiler will skip the entire block of code inside #ifndef from compiling.

When To Use #ifndef

We’ve explained this in detail for video tutorial: Conditional Compilation In C: #ifdef #else #endif It holds good for this video tutorial too.

Video Tutorial: Conditional Compilation In C: #ifndef #else #endif


[youtube https://www.youtube.com/watch?v=Y7UEY7Cxz7Y]

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

Source Code: Conditional Compilation In C: #ifndef #else #endif

#include<stdio.h>

#define iOS

int main()
{
    #ifndef iOS
        printf("I Love Apple Devices\n");
    #else
        printf("Code for Non Apple Devices\n");
    #endif // iOS

    return 0;
}

Output:
Code for Non Apple Devices

#include<stdio.h>


int main()
{
    #ifndef iOS
        printf("I Love Apple Devices\n");
    #else
        printf("Code for Non Apple Devices\n");
    #endif // iOS

    return 0;
}

Output:
I Love Apple Devices

In above programs, if iOS macro name is defined, then the set of code present inside #else block gets compiled and executed. If macro name iOS is not defined, then the code inside #ifndef block gets compiled and executed.

Note:

1. Using #else is optional. You can just use #ifndef and #endif.

2. Working of #ifndef is opposite to that of #ifdef.

3. This is similar to if else condition, but here the block of code which do not match the criteria doesn’t even get compiled. It’s treated like regular comments.

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

#error Preprocessor Directive: C Programming

In this video tutorial, lets see how we can make use of #error preprocessor command or directive.

Where Is It Useful?

If you’re a Software developer working with C programming language, then your project will have a lot of code and dependency source codes. While compiling, compiler will take a lot of time. In big projects usually you forget the purpose of compilation by the time it completes compilation. In such cases, make use of #error directive. If there are any errors at certain locations the compiler will stop further compilation as and when it encounters #error directive. This saves a lot of time and resources. So #error directive is usually helpful in debugging your project code.

It’s also helpful in projects with critical user inputs. Suppose user enters wrong data due to which the project itself might crash and utilize a lot of resource while trying to execute. In such cases it’s better to terminate the program execution.

Video Tutorial: #error Preprocessor Directive: C Programming


[youtube https://www.youtube.com/watch?v=_w2OBtOvzTg]

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

Source Code: #error Preprocessor Directive: C Programming

#include<stdio.h>

#define iOS

#ifndef iOS
    #error First Include iOS Macro
#else
    int main()
    {
        printf("I Love Apple Devices!\n");

        return 0;
    }
#endif // iOS

Output:
I Love Apple Devices!

Here #ifndef directive checks if the macro iOS is defined. If its NOT defined it returns true or 1. If it’s defined then it returns 0 or false.

So if the macro iOS is not defined, then the code inside #ifndef gets compiled and executed, else the code inside #else block gets compiled and executed.

When Macro iOS is not defined

When Macro iOS is not defined, the code inside #ifndef gets compiled, where the compiler encounters #error directive. Now the compiler immediately stops any further compilation and displays the error message associated with #error directive.

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

C Preprocessor Operator: defined

In this video tutorial lets see how to use preprocessor operator “defined” in C programming language.

How Does ‘defined’ preprocessor operator work?

defined preprocessor operator can only be used with #if and #elif directives.

If the Macro name passed to define is actually defined, then it returns true or else it’ll return false.

Syntac of “defined”

#if( defined(macro_name1) )
  // Some Set of Code
#elif( defined(macro_name2) )
  // Some More Set of Code
#endif

OR

#if defined(macro_name1) 
  // Some Set of Code
#elif defined(macro_name2) 
  // Some More Set of Code
#endif

Video Tutorial: C Preprocessor Operator: defined


[youtube https://www.youtube.com/watch?v=IDiV22rMPBk]

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

Source Code: C Preprocessor Operator: defined

#include<stdio.h>

#define PI 3.14159265358979323846

#define AREA

void area_circle(float r);
void circumference_circle(float r);

int main()
{
    float r;

    printf("Enter radius of Circle\n");
    scanf("%f", &r);

    #if defined(AREA)
        area_circle(r);
    #elif defined(CIRCUM)
        circumference_circle(r);
    #else
        printf("Code To Be Implemented\n");

    #endif // defined

    return 0;
}

void area_circle(float r)
{
    printf("Area of Circle is %f\n", (PI * r * r) );
}

void circumference_circle(float r)
{
    printf("Circumference of Circle is %f\n", (2 * PI * r) );
}

Output:
Enter radius of Circle
5
Area of Circle is 78.539816

In above source code AREA macro template or macro name is defined. So defined(AREA) returns true in #if condition. Hence the code inside #if block gets compiled and executed.

#include<stdio.h>

#define PI 3.14159265358979323846

#define CIRCUM

void area_circle(float r);
void circumference_circle(float r);

int main()
{
    float r;

    printf("Enter radius of Circle\n");
    scanf("%f", &r);

    #if defined(AREA)
        area_circle(r);
    #elif defined(CIRCUM)
        circumference_circle(r);
    #else
        printf("Code To Be Implemented\n");

    #endif // defined

    return 0;
}

void area_circle(float r)
{
    printf("Area of Circle is %f\n", (PI * r * r) );
}

void circumference_circle(float r)
{
    printf("Circumference of Circle is %f\n", (2 * PI * r) );
}

Output:
Enter radius of Circle
5
Circumference of Circle is 31.415927

Here macro name AREA is not defined, hence code inside #if gets skipped. Whereas macro CIRCUM is defined, so the code inside #elif gets compiled and executed.

If neither AREA and nor CIRCUM is defined, then code inside #else block gets compiled and executed.

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

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 https://www.youtube.com/watch?v=0s-y4WADkf0]

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

Conditional Compilation In C: #ifdef #else #endif

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

How Does #ifdef Work?

The block of code between #ifdef and #endif works only if the macro name is defined orelse the compiler will skip the entire block of code from compiling.

When To Use #ifdef

1. When we want the compiler to skip certain part of the source code: For this we could even use multi-line comment, but if we already had multi-line comments in the code, we can’t enclose the source code and multi-line comments with another multi-line comment. Nesting of multi-line comments are not allowed in C programming language. So instead of commenting the code we could make use of #ifdef directive.

2. To write portable code: For example, we could write code both for iOS and non-iOS devices. Using #ifdef we could check the device OS and based on that deliver specific set of codes. For this we can use #ifdef

Video Tutorial: Conditional Compilation In C: #ifdef #else #endif


[youtube https://www.youtube.com/watch?v=J0nWQRqb3Fc]

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

Source Code: Conditional Compilation In C: #ifdef #else #endif

#include<stdio.h>

#define iOS

int main()
{

    #ifdef iOS
        printf("This is iOS Code\n");
    #else
        printf("This is code for Android Devices\n");
    #endif // iOS

    return 0;
}

Output:
This is iOS Code

#include<stdio.h>

int main()
{

    #ifdef iOS
        printf("This is iOS Code\n");
    #else
        printf("This is code for Android Devices\n");
    #endif // iOS

    return 0;
}

Output:
This is code for Android Devices

In above programs, if iOS macro name is defined, then the set of code present inside #ifdef block gets compiled and executed. If macro name iOS is not defined, then the code inside #else block gets compiled and executed.

#include<stdio.h>
#define iOS

int main()
{

    #ifdef iOS
        printf("This is iOS Code\n");
    #endif // iOS

    printf("This is code for all non iOS Devices\n");

    return 0;
}

Output:
This is iOS Code
This is code for all non iOS Devices

#include<stdio.h>

int main()
{

    #ifdef iOS
        printf("This is iOS Code\n");
    #endif // iOS

    printf("This is code for all non iOS Devices\n");

    return 0;
}

Output:
This is code for all non iOS Devices

Note: using #else is optional. You can just use #ifdef and #endif.

This is similar to if else condition, but here the block of code which do not match the criteria doesn’t even get compiled. It’s treated like regular comments.

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