Sto tentando di identificare un problema a causa di un utilizzo insolito di macro variadic. Ecco la macro ipotetica:il problema del diverso trattamento a __VA_ARGS__ quando si utilizza VS 2008 e GCC
#define va(c, d, ...) c(d, __VA_ARGS__)
#define var(a, b, ...) va(__VA_ARGS__, a, b)
var(2, 3, printf, “%d %d %d\n”, 1);
Per gcc, il preprocessore emette
printf("%d %d %d\n", 1, 2, 3)
ma per VS 2008, l'uscita è
printf, “%d %d %d\n”, 1(2, 3);
Ho il sospetto che la differenza è causata dal diverso trattamento a VA_ARGS, per gcc, prima espande l'espressione in va (printf, "% d% d% d \ n", 1, 2, 3) e tratta 1, 2, 3 come VA_ARGS per macro va. Ma per VS 2008, per prima cosa verrà trattato come VA_ARGS per macro va, quindi verrà eseguita l'espansione.
Qual è l'interpretazione corretta per macro variadic C99? o il mio utilizzo cade in un comportamento indefinito?
stai cercando di risolvere realmente un problema, o stai semplicemente facendo un esercizio accademico/di ricerca? Ci sono modi per definire la macro var senza incorrere in questo problema. – Cheeso
Provo a risolvere il problema. Uso intensamente questo metodo nel mio progetto, il che mi fa risparmiare un sacco di tempo: http://liuliu.me/eyes/lets-abusively-use-cpp-macros – liuliu