Eu tenho uma função C que estou usando para formatar strings que possui a seguinte assinatura:
int
string_format
( char* dst
, const char* fmt
, ...
);
Eu costumo chamá-lo assim:
char buf[20];
const char* name = "Jeff";
string_format ( buf , "Hello %s!\n" , name );
Agora estou tentando trabalhar com texto colorido usando códigos de cores ANSI. Idealmente, quero usá-los em meus literais de string assim:
char buf[20];
const char* name = "Jeff";
string_format ( buf , COLOR_RED "Hello %s!\n" , name );
Escrevi algumas macros para construir essas strings literais, mas fiz algo errado. Por exemplo, eu tentei:
#define ANSI_CC(color) "\033["#color"m"
#define ANSI_CC_FG_RED "91"
#define COLOR_RED (ANSI_CC(ANSI_CC_FG_RED))
Mas quando tento chamar string_format (buf, COLOR_RED "Hello world.\n"")
, recebo um erro do compilador:
error: expected ')' before string constant
| COLOR_RED "Hello world.\n"
^~~~~~~~~~~~~~~~
Meu pensamento era que o pré-processador avaliaria COLOR_RED
isso:
COLOR_RED =>
(ANSI_CC(ANSI_CC_FG_RED)) =>
"\033["ANSI_CC_FG_RED"m" =>
"\033[""91""m"
Mas obviamente está fazendo outra coisa, que não entendo; Suspeito que usei o #
operador stringify incorretamente. Alguém poderia explicar o que o pré-processador está fazendo com as macros que escrevi? Além disso, se o que desejo realizar for possível, o que preciso mudar?
Obrigado.
Sua macro será expandida para:
Você precisa alterar a macro para:
e será expandido para:
https://godbolt.org/z/3oGzhhbYx