with va_args macro language functions example define c macros

va_args - Macros C: ventaja/intento de macro aparentemente inútil



macros c example (7)

Algunos compiladores (antiguos) de C no son compatibles con la palabra clave const y esta macro es probablemente una reminiscencia de una secuencia más elaborada de macros que manejaron diferentes compiladores. Se usa como en x = CONST(2.0)*y; aunque no tiene sentido

Puede consultar esta sección en la documentación de Autoconf para obtener más detalles.

EDITAR: Otro propósito de esta macro podría ser el preprocesamiento personalizado (por ejemplo, para extraer y / o reemplazar ciertas constantes), como hace el compilador Meta Object de Qt Framework.

Tengo algo de experiencia en programación en C, pero no me atrevería a llamarme proficiente. Recientemente, me encontré con la siguiente macro:

#define CONST(x) (x)

Encuentro que se usa típicamente en expresiones como por ejemplo:

double x, y; x = CONST(2.0)*y;

Completamente desconcertado por el punto de esta macro, investigué ampliamente las ventajas / desventajas y las propiedades de las macros, pero todavía no puedo averiguar cuál sería el uso de esta macro en particular. ¿Me estoy perdiendo de algo?


Bueno, este tipo de macro en realidad podría ser útil cuando hay una necesidad de solucionar la expansión de la macro.
Un ejemplo típico de tal necesidad es la macro de stringificación. Consulte la siguiente pregunta para ver un ejemplo: C Preprocesador, Stringify el resultado de una macro

Ahora, en su caso específico, no veo el beneficio en parte de los fines de la documentación extrema o del análisis de código.


Como se presenta en la pregunta, tienes razón en que la macro no hace nada.

Esto parece una estructura artificial impuesta por quien escribió ese código, tal vez para dejarlo bien claro dónde están las constantes y poder buscarlas. Pude ver la ventaja de tener constantes de búsqueda, pero esta no es la mejor manera de lograr ese objetivo.

También es posible que esto fuera parte de algún otro esquema macro que o bien nunca se implementó o solo se eliminó parcialmente.


Esta macro tiene el efecto de envolver paréntesis alrededor de x durante la expansión de la macro.

Supongo que alguien está tratando de permitir algo en la línea de

CONST(3+2)*y

el cual, sin los parens, se convertiría en

3+2*y

pero con los parens se convierte

(3+2)*y

Me parece recordar que tuvimos la necesidad de algo como esto en una vida de desarrollo anterior.


No hay absolutamente ningún beneficio de esa macro y quien la escribió debe estar confundido. El código es completamente equivalente a x = 2.0*y; .


Otra cosa buena acerca de esta macro sería algo como esto.

result=CONST(number+number)*2;

o algo relacionado con comparaciones

result=CONST(number>0)*2;

Si hay algún problema con esta macro, probablemente sea el nombre. Esta cosa "CONST" no está relacionada con constantes sino con alguna otra cosa. Sería bueno buscar el resto del código para saber por qué el autor lo llamó CONST.


Otro uso podría ser reservar esos valores como futuras invocaciones de funciones, algo como esto:

/* #define CONST(x) (x) */ #define CONST(x) some_function(x) // ... double x, y; x = CONST(2.0)*y; // x = some_function(2.0)*y;