Quero uma macro para detectar se o argumento passado está entre parênteses ou não e, se for o caso, chamar uma macro diferente.
por exemplo
#define FOO(obj) BAR obj
#define BAR(...) func(__VA_ARGS__)
#define BAR
Se eu chamar isso com FOO((1, 2, 3))
ele se expandiria para func(1, 2, 3)
. Mas se eu chamar isso com FOO(1)
ele deveria se expandir para1
Eu sei que sobrecarga de macro não é uma coisa em C, mas estou pensando se há outra maneira de atingir esse comportamento a partir de FOO
. Eu pesquisei vários truques de macro, mas não consegui descobrir uma maneira de fazer isso.
Estou trabalhando em uma biblioteca de macros e preciso desse comportamento exato.
Neste caso,
FOO(1)
expande para(1)
e não1
, mas isso provavelmente é mais desejável.Acontece que isso aceita incorretamente
FOO((1,2)3)
, expandindo-o parabar(1,2 3)
. Com ginástica macro adicional, você pode rejeitar isso:Acabei de escrever isso. Isso pode ser simplificado, é só a primeira versão que eu peguei no godbolt que funcionou. Deve ser o suficiente para você começar.
Isso parece melhor. Depois de converter
__VA_ARGS__
para uma vírgula, é só uma questão de obter uma posição arg adequada.