Pergunta

Eu quero escrever uma macro em C que aceita qualquer número de parâmetros, não é um número específico

exemplo:

#define macro( X )  something_complicated( whatever( X ) )

onde X é qualquer número de parâmetros

Eu preciso disso porque whatever está sobrecarregado e pode ser chamado com 2 ou 4 parâmetros.

Eu tentei definindo a macro duas vezes, mas a segunda definição overwrote o primeiro!

O compilador Eu estou trabalhando com é g ++ (mais especificamente, mingw)

Foi útil?

Solução

C99 forma, também apoiado pelo compilador VC ++.

#define FOO(fmt, ...) printf(fmt, ##__VA_ARGS__)

Outras dicas

__VA_ARGS__ é a maneira padrão de fazê-lo. Não use hacks específicos do compilador se você não tem que.

Estou realmente ficar irritado que eu não posso comentar sobre o post original. Em qualquer caso, C ++ não é um super conjunto de C. É realmente bobo para compilar o código C com um compilador C ++. Não faça o que Donny Do não.

Eu não acho que isso é possível, você poderia fingir com parens duplas ... apenas contanto que você não precisa os argumentos individualmente.

#define macro(ARGS) some_complicated (whatever ARGS)
// ...
macro((a,b,c))
macro((d,e))
#define DEBUG

#ifdef DEBUG
  #define PRINT print
#else
  #define PRINT(...) ((void)0) //strip out PRINT instructions from code
#endif 

void print(const char *fmt, ...) {

    va_list args;
    va_start(args, fmt);
    vsprintf(str, fmt, args);
        va_end(args);

        printf("%s\n", str);

}

int main() {
   PRINT("[%s %d, %d] Hello World", "March", 26, 2009);
   return 0;
}

Se o compilador não entende macros variádicos, você também pode tirar fora PRINT com um dos seguintes procedimentos:

#define PRINT //

ou

#define PRINT if(0)print

Os primeiros comentários fora as instruções de impressão, a segunda evita IMPRIMIR instrução por causa de uma NULL se a condição. Se a otimização for definido, o compilador deve retirar instruções não executados como: if (0) print ( "Olá mundo"); ou ((void) 0);

explicou para g ++ aqui, embora seja parte de C99 por isso deve funcionar para todos

http://www.delorie.com/gnu/docs/gcc /gcc_44.html

exemplo rápido:

#define debug(format, args...) fprintf (stderr, format, args)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top