Macro DEBUG do pré-processador

Neste desafio, você não deve escrever uma função, mas sim duas macros de pré-processador C/C++. A ideia era ter apenas uma macro, mas, como não há acesso direto ao compilador nem aos arquivos-fonte, isso não foi possível.

De qualquer forma, essas macros devem ser macros simples de depuração. A primeira (DOUT) imprime/transmite a entrada que recebe para std::cout. A segunda (NDOUT) ignora toda a entrada e não faz nada.

Essas macros devem ser macros do tipo função. Cada uma recebe um argumento, que pode incluir operadores de fluxo ( operator<< ). Depois de cada uso dessas macros há um ponto e vírgula: DOUT( /* input */ );

Exemplos

DOUT( "Hello " << "World!" ); ➞ "Hello World!"

DOUT( 1 << '+' << 2 << '=' << 1+2 ); ➞ "1+2=3"

NDOUT( "Hello" << "World!" ); ➞ ""

Notas

  • Lembre-se de transmitir a saída para std::cout. Não use printf nem qualquer outra coisa. Não tente retornar uma string.
  • Para distribuir as definições de macros em várias linhas, você pode usar barras invertidas \ como o último caractere de uma linha:
#define N \
123

std::cout << N << std::endl;         // prints "123"

Nada importante

Meu plano original era compilar condicionalmente a macro DOUT dependendo de DEBUG estar definido ou não ( ➞ #ifdef ... ). Como mencionado anteriormente, isso não era possível, pois não tenho acesso aos arquivos-fonte do seu código ou dos testes, nem ao próprio compilador. É por isso que você precisa implementar duas macros distintas, e não apenas uma.