GCC se queja si hago esto:¿Puedo definir varias macros de preprocesador C con __VA_ARGS en el medio en lugar del final?
#define M(obj,met, ..., contents) obj##_##met(const void * self, __VA_ARGS__) { \
contents \
}
mi Realizar estas 2 razones:
error: missing ')' in macro parameter list
warning: __VA_ARGS__ can only appear in the expansion of a C99 variadic macro
Al parecer, C99 - estilo macros variadic esperan el paréntesis de cierre inmediatamente después de los puntos suspensivos, exigiendo de manera efectiva que el variadic lista ser los últimos argumentos de la macro. Necesito que esté en el medio para producir mi notación abreviada que se describe en la macro de arriba. ¿GCC es compatible con esta característica, utilizando otro estilo de macro variadic (no C99)? ¿Puedo emularlo haciéndolo de alguna otra manera? No quiero la lista variadic al final, hará que mi notación sea confusa. Y solo puedo usar GCC.
* No quiero la lista variadic al final, hará que mi notación sea confusa. Y solo puedo usar GCC. * No tienes suerte. –
Consulte [Boost.Preprocessor] (http://www.boost.org/doc/libs/1_43_0/libs/preprocessor/doc/index.html). Estoy casi seguro de que puede hacerlo siempre que deje de tratar de identificar el "contenido" como un argumento separado: utiliza una parte de las cosas del preprocesador para identificar el último argumento de los argumentos variables. La definición es un poco más compleja, por supuesto. –