Функции - это сегменты кода, которые можно многократно вызывать из разных частей программы для выполнения определенного действия. Обычно существует только одна функция для данной задачи. Если макрос существует, фактический код будет вставляться в программу (во время компиляции) каждый раз, когда макрос используется.
Таким образом, вызовы функций приводят к более компактным процедурам, но возникают накладные расходы при их вызове и использовании. Макрос не требует накладных расходов, но процедура будет больше и займет больше памяти.