Vantagens do pré-processador condicional em relação a instruções condicionais

Eu nunca trabalhei com#E se, #ifdef, #ifndef, #outro, #elif e#fim se.

Como eu estava passando por alguns códigos-fonte, encontrei um uso extensivo dessas diretivas. Fiz algumas leituras em pré-processadores condicionais, mas não encontrou nenhuma pistacomo eles são diferentes das declarações condicionais normais?. Então eu queria saber qual é a vantagem de seguir o código:

#include<iostream>
int main()
{
    int i = 0;

    #if i == 0
         std::cout<<"This";
    #else
         std::cout<<"That";
    #endif
    return 0;
}

por cima disto:

#include<iostream>
int main()
{
    int i = 0;

    if (i == 0)
         std::cout<<"This";
    else
         std::cout<<"That";
    return 0;
}

Além disso, quandousar/ pré-processador não-a-usar?

questionAnswers(5)

yourAnswerToTheQuestion