Soy un poco reacio a publicar esta respuesta porque su uso de macro hackers puede convertirse en la fuente de problemas. Sin embargo, si las llamadas a la función que quiere que desaparezcan siempre se usan solas en una instrucción (es decir, nunca forman parte de una expresión más grande), entonces algo como lo siguiente podría funcionar (y maneja varargs):
#ifdef SOMETHING
#define foo (1) ? ((void) 0) : (void)
#else
#define foo MyFunction
#endif
lo tanto, si usted tiene la línea de código:
foo("this is a %s - a++ is %d\n", "test", a++);
que va a terminar después de la etapa de preprocesamiento ya sea como:
MyFunction("this is a %s - a++ is %d\n", "test", a++);
o
(1) ? ((void) 0) : (void)("this is a %s - a++ is %d\n", "test", a++);
que convierte lista de parámetros del pseudo-función en un montón de expresiones separadas por el operador de coma que nunca será evaluado, ya que el condicional siempre devuelve el resultado ((void) 0)
.
Una variante de esto es algo parecido a lo que sugirió ChrisW y Jonathan Leffler:
#ifdef SOMETHING
#define foo if (0) MyFunction
#else
#define foo if (1) MyFunction
#endif
Esta cifra es ligeramente diferente, ya que no requiere el compilador para apoyar las macros variadic (__VA_ARGS__
).
Creo que esto puede ser útil para eliminar llamadas de función de seguimiento de depuración que generalmente nunca se combinan en una expresión más grande, pero más allá de eso, creo que es una técnica peligrosa.
Tenga en cuenta la posibilidad de problemas, especialmente si los parámetros en la llamada producen efectos secundarios (este es un problema general con las macros, no solo este truco). En el ejemplo, el a++
se evaluará solo si SOMETHING
está definido en la compilación, de lo contrario no lo es. Entonces, si el código después de la llamada depende del valor de a
para ser incrementado, una de las compilaciones tiene un error.
Vea si su compilador admite 'macros variadic'. – ChrisW
_¿Por qué querrías hacer esto? Tal vez hay alguna otra forma de obtener lo que necesita. Porque sin contexto, lo que quiere hacer parece bastante peligroso ... – gimpf
Para compiladores que no admiten macros variadic es bueno poder eliminar cadenas de depuración y llamadas a funciones. Ahorra mucho espacio ejecutable. – MSN