Necesita un poco de direccionamiento indirecto. Con C99:
#define NEED3ARGS(a1,a2,a3) ("[" #a1 " + " #a2 " + " #a3 "]")
#define INVOKE_NEED3ARGS(...) NEED3ARGS(__VA_ARGS__)
#define MULTIARG() ARG1, ARG2, ARG3
INVOKE_NEED3ARGS(MULTIARG())
(. C99 no es estrictamente necesario, se puede sustituir la macro variadic con una macro-aridad fijo)
Si necesita compilar las fuentes utilizando Visual C++, se le necesitará aún más indirecta (a causa de a compiler bug):
#define NEED3ARGS(a1,a2,a3) ("[" #a1 " + " #a2 " + " #a3 "]")
#define INVOKE_NEED3ARGS_(...) NEED3ARGS __VA_ARGS__
#define INVOKE_NEED3ARGS(...) INVOKE_NEED3ARGS_((__VA_ARGS__))
#define MULTIARG() ARG1, ARG2, ARG3
INVOKE_NEED3ARGS(MULTIARG())
en cuanto a por qué se necesita indirecto: un argumento macro no es Evalu ated y macro-reemplazado hasta que se sustituya en la lista de reemplazo. Por lo tanto, cuando intente NEED3ARGS(MULTIARG())
, MULTIARG()
no se evaluará hasta que después de haya comenzado la invocación de macro, por lo que se trata como un único argumento.
La macro INVOKE_NEED3ARGS
asegura que sus argumentos se evalúen completamente antes de invocar NEED3ARGS
. El __VA_ARGS__
se sustituye por los argumentos macro-reemplazados en INVOKE_NEED3ARGS
, que es ARG1, ARG2, ARG3
, luego se invoca NEED3ARGS
con esos argumentos.