Palavras-chave: C, C++, CPP, macro, string, identificador
Para transformar o nome de um macro ou identificador em string:
#define STR(s) #s
Para transformar o valor de um macro ou identificador em string:
#define STRV(s) STR(s)
O seguinte exemplo ilustra a diferença:
#define STRV(s) STR(s) #define STR(s) #s int main() { puts("1: "STR(puts)); puts("2: "STR(123)); puts("3: "STR(__LINE__)); puts("4: "STRV(__LINE__)); return 0; }
Resultado:
1: puts 2: 123 3: __LINE__ 4: 9
Note como STR() retorna um string com o nome do macro, enquanto que STRV() retorna o valor.
No kernel Linux existe o arquivo include/linux/stringify.h, que por ser bem pequeno e tratar do caso neste post eu aqui transcrevo:
—
/* Indirect stringification. Doing two levels allows the parameter to be a
* macro itself. For example, compile with -DFOO=bar, __stringify(FOO)
* converts to “bar”.
*/
#define __stringify_1(x) #x
#define __stringify(x) __stringify_1(x)
—
Como geralmente quando passamos um macro queremos o valor do mesmo e não uma representação string de sua definição, usamos sempre o __stringify().
Trivia:
Vejamos quantas vezes o __stringify() é usado nos fontes de um kernel Linux recente:
[acme@filo linux-2.6]$ find . -name “*.[ch]” | xargs grep -w __stringify | wc -l
170
169 vezes.
E o __stringify_1()?
[acme@filo linux-2.6]$ find . -name “*.[ch]” | xargs grep __stringify_1
./include/linux/stringify.h:#define __stringify_1(x) #x
./include/linux/stringify.h:#define __stringify(x) __stringify_1(x)
[acme@filo linux-2.6]$
Nenhuma vez :-)
ACME,
Ninguém nunca usa o __stringify_1(x) diretamente, simplesmente pq ele é um “helper” usada no “__stringify(x)”, devido à ordem de avaliação e expansão, vide:
CPP “Stringification” (http://tigcc.ticalc.org/doc/cpp.html#SEC17)
Então, ou eu não entendi o seu
“””Como geralmente quando passamos um macro queremos o valor do mesmo e não uma representação string de sua definição, usamos sempre o __stringify()”””
Ou você escreveu o contrário do que acontece :-) ! Vide exemplos no link supracitado.
Abraços,
Boa noite pessoal,
Estou iniciando na programação no C++ e gostaria de saber como que eu faço para fazer uma substituição de uma função padrão do C++ por uma função customizada, por exemplo, no C++ existe a função cout, mas eu quero substituí-la pela função escreva que fará a mesma coisa do cout. Alguém saberia como fazer?? No aguardo.
Atenciosamente,
John Lennon