Macro que imprime uma expressão e a avalia (com __String)
-
22-08-2019 - |
Pergunta
Para aprender e demonstrar, preciso de uma macro que imprime seu parâmetro e avalia isso. Suspeito que seja um caso muito comum, pode ser até uma FAQ, mas não consigo encontrar referências reais.
Meu código atual é:
#define PRINT(expr) (fprintf(stdout, "%s -> %d\n", __STRING(expr), (expr)))
e depois:
PRINT(x & 0x01);
Funciona bem, mas não tenho certeza do status legal da macro __String, especialmente porque está no espaço de nome __ privado.
Então, minhas perguntas:
- Existe uma maneira melhor de escrever esta macro?
- __String Standard/Great/Mal?
- Como usar as ferramentas de pesquisa existentes para encontrar sobre __String? O mecanismo de pesquisa de So só procura qualquer coisa que contenha string :-(
Solução
Você pode usar o token de pré -processador # que converte seu argumento RHS em uma string literal:
#include <stdlib.h>
#include <stdio.h>
#define STR(x) #x
#define PRINT(expr) (fprintf(stdout, "%s -> %d\n", STR(expr), (expr)))
int main(void)
{
int x = 7;
PRINT(x & 0x01);
return EXIT_SUCCESS;
}
2) Definitivamente não é padrão, e é a primeira vez que me deparo com isso; Não é de surpreender, pois parece não fazer muito mais do que a macro str () acima, à primeira vista.
3) Google parece funcionar bem.
Outras dicas
Algo como
#define PRINT(expr) (fprintf(stdout, "%s -> %d\n", #expr, (expr)))
é provavelmente o que você quer. # é o operador de stringification.