Разница между условной компиляцией и директивой #define заключается в их функциях.
Условная компиляция позволяет выборочно компилировать части исходного кода программы в зависимости от определённых условий. 3 К директивам условной компиляции относятся, например, #if, #ifdef, #elif, #else, #endif. 15
Директива #define, в свою очередь, позволяет вводить в текст программы константы и макроопределения. 5 С её помощью объявляются символические константы, которые при обработке исходного кода препроцессором заменяются на соответствующие им числовые или строковые литералы. 2
Таким образом, условная компиляция ориентирована на управление процессом компиляции, а директива #define — на определение и замену конкретных фрагментов кода.