Language
日本語
English

Caution

JavaScript is disabled in your browser.
This site uses JavaScript for features such as search.
For the best experience, please enable JavaScript before browsing this site.

C Language Dictionary

  1. Home
  2. C Language Dictionary
  3. #ifdef / #ifndef / #if / #endif

#ifdef / #ifndef / #if / #endif

Since: C89(1989)

Conditional compilation controls whether specific parts of your source code are compiled based on whether a macro is defined and its value. It is commonly used for cross-platform support, toggling debug code, and preventing header files from being included more than once.

Syntax

#ifdef MACRO_NAME
    code
#endif

// Compiles the block if the macro is NOT defined.
#ifndef MACRO_NAME
    code
#endif

// Conditional branching combined with #else.
#ifdef MACRO_NAME
    code when the macro is defined
#else
    code when the macro is not defined
#endif

// Evaluates a condition based on the macro's value.
#if constant-expression
    code
#elif constant-expression
    code
#else
    code
#endif

// Header guard (idiom to prevent double inclusion).
#ifndef HEADER_NAME_H
#define HEADER_NAME_H
    // Header contents
#endif

Conditional Compilation Directives

DirectiveDescription
#ifdefCompiles the block if the specified macro is defined.
#ifndefCompiles the block if the specified macro is NOT defined. Used for header guards.
#ifCompiles the block if the constant expression is non-zero (true). Allows branching on macro values.
#elifAdds another condition after #if / #ifdef / #ifndef.
#elseDefines the block to compile when the preceding condition is false.
#endifEnds the conditional block.
defined(MACRO_NAME)An operator used inside #if to check whether a macro is defined.

Sample Code

sample_ifdef_ifndef.c
#include <stdio.h>

// Define a macro for debug mode (can also be passed at compile time with -DDEBUG).
#define DEBUG

// Compile-time branching based on the OS.
#if defined(_WIN32) || defined(_WIN64)
    #define PLATFORM "Windows"
#elif defined(__linux__)
    #define PLATFORM "Linux"
#elif defined(__APPLE__)
    #define PLATFORM "macOS"
#else
    #define PLATFORM "Unknown"
#endif

// Debug log macro (only active when DEBUG is defined).
#ifdef DEBUG
    #define LOG(msg) printf("[DEBUG] %s\n", msg)
#else
    #define LOG(msg) // Does nothing (removed in release builds).
#endif

int main(void) {
    printf("Platform: %s\n", PLATFORM);

    LOG("Program started."); // Printed because DEBUG is defined.

    int x = 42;

    #ifdef DEBUG
        // Check the variable value only in debug mode.
        printf("[DEBUG] x = %d\n", x);
    #endif

    // Branch on a constant value using #if.
    #define VERSION 2
    #if VERSION >= 2
        printf("Using features for version 2 or later.\n");
    #elif VERSION == 1
        printf("Using features for version 1.\n");
    #else
        printf("Unknown version.\n");
    #endif

    return 0;
}

Common Mistakes

Common Mistake: Header Guard Macro Name Collision

If a header guard macro name is too short, it may collide with names in other headers. Use a unique name based on the filename.

/* NG: too short and prone to collision */
#ifndef H
#define H
/* header contents */
#endif

The corrected version is:

/* OK: unique name based on the filename */
#ifndef MYPROJECT_UTILS_H
#define MYPROJECT_UTILS_H
/* header contents */
#endif /* MYPROJECT_UTILS_H */

Notes

Always add a header guard to every header file. If the same header is included multiple times, it will cause duplicate definition errors for types and functions. Use an all-uppercase, underscore-separated name based on the filename for the header guard macro (e.g., MYHEADER_H) to avoid collisions with other macros.

Some compilers support the non-standard #pragma once directive as a concise alternative to header guards, but since it is not part of the C standard, use the conventional #ifndef pattern when portability is a concern.

For details on #pragma, see #pragma / #error / #warning. For the basics of macro definitions, see #include / #define (constants).

If you find any errors or copyright issues, please .