domingo, febrero 06, 2011

Macros en C con número variable de parámetros

A veces me he encontrado con la necesidad de realizar una macro que tenga un número variable de parámetros. ¿Cómo implementa esta funcionalidad el preprocesador de C?. Pues de la siguiente manera:

  • Usamos la elipsis (...) a la hora de definir en la macro, como si estuviésemos definiendo una función
  • Cuando queremos usar los parámetros libres usamos el identificador __VA_ARGS__, que el preprocesador sustituirá por los parémtros que se le han pasado a la macro.
Un ejemplo del uso de esta construcción puede verse en el siguiente fichero de cabecera:
#ifndef _DEBUG_H
#define _DEBUG_H 1
#ifdef DEBUG
        #define debug(format,...) output_debug (__FUNCTION__,__LINE__,format,__VA_ARGS__);
#else
        #define debug(format,params)
#endif
int output_debug (const char *funcname,unsigned int line,const char *format,...);
#endif

Existe un punto donde la anterior sintaxis puede dar problemas, como es el caso de que no se pase ningún parámetro a la macro: El estándar C obliga a que al menos un parámetro sea pasado a la elipsis para evitar dejar una coma colgada. El gcc tiene varias extensiones para tratar con este problema, mientras que el Visual C++, si no se pasan ningún argumento suprime la coma directamente. En el caso del gcc usa la siguiente construcción, que sólo es válida delante de una coma:

#define  debug  (format,...) output_debug (__FUNCTION__,__LINE__,format,##__VA_ARGS__);
En este caso los símbolos ## hace que se elimine la coma si no se pasan parámetros.

Referencias

  1. Variadic Macrod
  2. Variadic Macros (Visual Studio)

Technorati Tags:

No hay comentarios: