Існує також можливість керувати самою первниино обробкою — за допомогою умовних виразів, які обробить препроцесор. Це дає можливість вибіркового включення коду, залежно від значень умов, розглянутих під час компіляції.
Рядок #if обчислює константний цілочисельний вираз (який не може включати sizeof, зведення типів або констант енумерації). Якщо вираз не є нульовим, всі наступні рядки до#endif або #elif або ж #else буде включено. (Препроцесорний вираз #elif подібний доesle-if.) Вираз defined(назва) після #if дорівнюватиме 1, якщо назву було означено і 0, якщо ні.
Наприклад, щоб упевнитись, що вміст файла hdr.h включено тільки один раз, сам вміст оточується умовою на зразок наступної:
#if !defined(HDR)
#define HDR
/* тут йде вміст hdr.h */
#endif
Перше включення hdr.h визначає ім'я HDR; наступні включення знаходитимуть це ім'я означеним і стрибатимуть далі аж до #endif. Цей стиль можна використати і щоб запобігти багаторазового включення тих самих файлів. Якщо послідовно впроваджувати даний стиль, тоді кожний файл заголовка може самостійно включати будь-які інші файли заголовка, від яких він залежить, звільняючи користувача заголовка від клопоту про взаємозалежності.
Наступні декілька рядків перевіряють змінну SYSTEM для того, щоб вирішити, яку саме версію файла заголовка включити:
#if SYSTEM == SYSV
#define HDR "sysv.h"
#elif SYSTEM == BSD
#define HDR "bsd.h"
#elif SYSTEM == MSDOS
#define HDR "msdos.h"
#else
#define HDR "default.h"
#endif
#include HDR
Вирази #ifdef і #ifndef являються спеціалізованою формою, яка перевіряє чи ім'я означено, чи ні. Перший приклад з #if вище можна було також написати як
#ifndef HDR
#define HDR
/* тут йде вміст hdr.h */
#endif