Eu quero escrever uma macro em C que aceite qualquer número de parâmetros, não um número específico
exemplo:
#define macro( X ) something_complicated( whatever( X ) )
Onde X
está qualquer número de parâmetros
Eu preciso disso porque whatever
está sobrecarregado e pode ser chamado com 2 ou 4 parâmetros.
Tentei definir a macro duas vezes, mas a segunda definição substituiu a primeira!
O compilador com o qual estou trabalhando é g ++ (mais especificamente, mingw)
c
g++
c-preprocessor
variadic
hasen
fonte
fonte
Respostas:
Maneira C99, também suportada pelo compilador VC ++.
fonte
##
não é necessário e não é portátil.#define FOO(...) printf(__VA_ARGS__)
faz o trabalho da maneira portátil; ofmt
parâmetro pode ser omitido da definição.__VA_ARGS__
é a maneira padrão de fazer isso. Não use hacks específicos do compilador, se não for necessário.Estou muito chateado por não poder comentar a postagem original. De qualquer forma, C ++ não é um superconjunto de C. É realmente uma bobagem compilar seu código C com um compilador C ++. Não faça o que Donny não faz.
fonte
class
porklass
permitir compilar com um compilador C ++. Observe também que existem algumas diferenças que o farão tropeçar; por exemplo, o operador ternário não é avaliado da mesma maneira nos dois idiomas, e ainline
palavra - chave significa algo completamente diferente (como aprendi com uma pergunta diferente).Eu não acho que isso seja possível, você pode fingir com parênteses duplos ... desde que não precise dos argumentos individualmente.
fonte
Se o compilador não entender macros variadas, você também poderá remover o PRINT com um dos seguintes procedimentos:
ou
O primeiro comenta as instruções PRINT, o segundo impede a instrução PRINT devido a uma condição NULL if. Se a otimização estiver definida, o compilador deve remover instruções nunca executadas, como: if (0) print ("hello world"); ou ((nulo) 0);
fonte
if
versão adequada do "não faça isso" que leva em consideração a estrutura do código é:if (0) { your_code } else
ponto-e-vírgula após a expansão da macroelse
. Awhile
versão é semelhante a:while(0) { your_code }
O problema com ado..while
versão é que o códigodo { your_code } while (0)
é feito uma vez, garantido. Nos três casos, seyour_code
estiver vazio, é apropriadodo nothing gracefully
.explicado para g ++ aqui, embora faça parte do C99, portanto, deve funcionar para todos
http://www.delorie.com/gnu/docs/gcc/gcc_44.html
exemplo rápido:
fonte
__VA_ARGS__
, embora também sejam suportados por compiladores em versões anteriores, como uma extensão.