Software Design

Design de software em C, C++, Java, etc…

Dica: Utilizando varargs em diretivas #define

Recentemente precisei isolar um código legado para depuração e durante os testes precisava ver o que estava logado, porém o sistema em questão utiliza uma biblioteca de logs proprietária que disponibiliza uma função chamada trace(format, …) de sintaxe semelhante à do printf.

O que eu precisava era basicamente redirecionar as chamadas à função trace para a printf adicionando uma quebra de linha ao final da chamada já que a função trace já trata isso.

Para resolver este problema utilizamos as variadic macros:


#define trace(format, ...) printf(format, ##__VA_ARGS__); printf("\n");

A sintaxe é bem simples, acho que a única coisa que precisa de detalhamento é o argumento __VA_ARGS__. O identificador __VA_ARGS__ é tratado de forma especial pelo pré-processador que faz a substituição do … pelo conteúdo das va_args da função. No meu caso, antes do __VA_ARGS__ eu coloquei o duplo # porque passar os va_args é opcional então se uma alguém chamasse trace da seguinte forma:


trace("Mensagem de log");

o pré-processador substituiria por isso:


printf("Mensagem de log", );

causando um erro de sintaxe. Adicionando o ## faz com que ele trate este caso omitindo a vírgula quando não tem va_args na chamada.

Fonte: http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Informação

Publicado às outubro 10, 2013 por em C++ e marcado , , , , .
%d blogueiros gostam disto: