Суть макросов в с++?
Макроссы часто используют для условного включения каких-то функций на этапе компиляции. Например, отладочного логирования. Тогда в зависимости от ключей компиляции можно получить релизный исполняемый файл вообще без этого ненужного кода.

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

Макросы позволяют не выполнять выражение, а передать его, как есть. Это полезно для создания отложенных функций, так называемых санков (thunk). 

Это один из юзкейсов) 

Второй юзкейс - упрощение синтаксиса. Или делание его более удобным для применения. Например тебе не удобно пользоваться if выражением. Скажем, постоянно путаешься, какой код выполняется в true блоке, а какой в false. 

Берешь и создаешь макрос my-if в котором привычный синтаксис if expression true_clause else_clause превращаешь в допустим if expression then true_clause else false_clause