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