C++ #if, #ifdef, #ifndef: Conditional Compilation in C++

beginner
15 min

C++ #if, #ifdef, #ifndef: Conditional Compilation in C++

Welcome to our deep dive into C++ conditional compilation! In this lesson, we'll explore #if, #ifdef, and #ifndef - powerful tools that let you write flexible code and avoid unnecessary compilations. Let's get started!

What are Conditional Compilation Directives?

šŸ’” Pro Tip: These directives allow you to control code execution during the compilation phase, making it possible to include, exclude, or modify parts of your code based on specific conditions.

Understanding #if, #ifdef, and #ifndef

#if

šŸ“ Note: #if is a directive that checks if a condition is true, and if so, includes the code block between the #if and #else or #endif.

cpp
#include <iostream> int main() { int a = 10; #if a > 5 std::cout << "a is greater than 5" << std::endl; #endif return 0; }

#ifdef, #ifndef, and #define

#ifdef, #ifndef, and #define are closely related directives. #define defines a symbol (or macro), #ifdef checks if the symbol is defined, and #ifndef checks if the symbol is not defined.

cpp
#include <iostream> #define MY_SYMBOL 1 int main() { #ifdef MY_SYMBOL std::cout << "MY_SYMBOL is defined" << std::endl; #endif return 0; }

In the above example, we've used #define to create a symbol MY_SYMBOL. Replacing MY_SYMBOL with other symbols in #ifdef will help you test different conditions.

Practical Example

Let's consider a simple program that compiles differently for debugging and release versions.

cpp
#include <iostream> #define RELEASE_MODE #ifdef RELEASE_MODE #define PRINT_INFO(message) // No printing in release mode #else #define PRINT_INFO(message) std::cout << message << std::endl; // Printing enabled in debug mode #endif int main() { PRINT_INFO("Hello, World!"); return 0; }

In this practical example, we've used #define to create a symbol RELEASE_MODE. Depending on whether RELEASE_MODE is defined or not, the program will either print "Hello, World!" or not.

Quiz

Question: If you define the symbol DEBUG_MODE in your code, which of the following will print "Debugging enabled!" in the main function?

cpp
#include <iostream> #define DEBUG_MODE #ifdef DEBUG_MODE #define PRINT_INFO(message) std::cout << message << std::endl; #else #define PRINT_INFO(message) #endif int main() { PRINT_INFO("Debugging enabled!"); return 0; }

A: The code will not compile.

B: The code will compile, but "Debugging enabled!" will not be printed.

C: The code will compile, and "Debugging enabled!" will be printed.

Correct: C

Explanation: By defining DEBUG_MODE, the #ifdef DEBUG_MODE block will be executed, which in turn defines PRINT_INFO to print the specified message, resulting in "Debugging enabled!" being printed in the output.