C, C++: Transformar macros e identificadores em strings

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.

This entry was posted in C, CPP. Bookmark the permalink.

3 Responses to C, C++: Transformar macros e identificadores em strings

  1. 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 :-)

  2. 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,

  3. John Lennon Barbosa Lima says:

    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

Comments are closed.