Domanda

Voglio scrivere una macro in C che accetta qualsiasi numero di parametri, non un numero specifico

Esempio:

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

dove X è un qualsiasi numero di parametri

Ho bisogno di questo perché whatever è sovraccarico e può essere chiamato con 2 o 4 parametri.

Ho cercato di definire la macro due volte, ma la seconda definizione sovrascritto il primo!

Il compilatore con cui sto lavorando è g ++ (più precisamente, mingw)

È stato utile?

Soluzione

modo C99, anche supportato da C ++.

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

Altri suggerimenti

__VA_ARGS__ è il modo standard per farlo. Non usare hack specifiche del compilatore se non è necessario.

Sono molto infastidito dal fatto che non posso commentare il post originale. In ogni caso, C ++ non è un superset di C. E 'davvero stupido per compilare il codice C con un compilatore C ++. Non fare quello Donny Non farlo lo fa.

Non credo che sia possibile, si potrebbe fingere con doppie parentesi ... basta che non è necessario gli argomenti singolarmente.

#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 il compilatore non capisce le macro variadic, è anche possibile eliminare fuori PRINT con uno dei seguenti:

#define PRINT //

o

#define PRINT if(0)print

I primi commenti fuori le istruzioni di stampa, il secondo impedisce di istruzioni PRINT a causa di un NULL se la condizione. Se l'ottimizzazione è impostato, il compilatore dovrebbe striscia fuori istruzioni mai eseguite come: if (0) print ( "ciao mondo"); o ((vuoto) 0);

spiegato per g ++ qui, anche se è parte di C99 così dovrebbe funzionare per tutti

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

rapido esempio:

#define debug(format, args...) fprintf (stderr, format, args)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top