Una ventaja importante de la implementación basada en macro es que no está vinculada a ningún tipo concreto de parámetro. Una macro de función en C actúa, en muchos aspectos, como una función de plantilla en C++ (las plantillas en C++ nacieron como macros "más civilizadas", por cierto). En este caso particular, el argumento de la macro no tiene un tipo concreto.Podría ser absolutamente cualquier cosa que sea convertible al tipo unsigned long
. Por ejemplo, si el usuario lo desea (y si están dispuestos a aceptar las consecuencias definidas por la implementación), pueden pasar tipos de puntero a esta macro.
De todos modos, tengo que admitir que esta macro no es el mejor ejemplo de la flexibilidad de macros independiente del tipo, pero en general, la flexibilidad es práctica con bastante frecuencia. De nuevo, cuando cierta función es implementada por una función, está restringida a tipos de parámetros específicos. En muchos casos, para aplicar una operación similar a diferentes tipos, es necesario proporcionar varias funciones con diferentes tipos de parámetros (y diferentes nombres, ya que esto es C), mientras que lo mismo se puede hacer con una macro de función. Por ejemplo, macro
#define ABS(x) ((x) >= 0 ? (x) : -(x))
trabaja con todo tipo de aritmética, mientras que la implementación basada en la función tiene que proporcionar un buen número de ellos (estoy implicando el estándar abs
, labs
, llabs
y fabs
). (Y sí, soy consciente de los peligros tradicionalmente mencionados de tales macro.)
Las macros no son perfectas, pero la máxima popular sobre "macros funcionales ya no son necesarias debido a las funciones en línea" es simplemente una tontería . Para reemplazar completamente las macros de función, C va a necesitar plantillas de funciones (como en C++) o al menos sobrecarga de funciones (como en C++ de nuevo). Sin esa función, las macros son y seguirán siendo la herramienta principal extremadamente útil en C.
Como las funciones hash van, eso es bastante débil, pero parece que los datos que tiene que tratar también son bastante simples. –
En realidad, no es muy brillante hacer de esto un 'macro'. Una [función estática en línea] (http://stackoverflow.com/questions/7762731/whats-the-difference-between-static-and-static-inline-function) es probablemente más apropiada. * C * ha estado en línea desde 1999 y 'gcc' incluso antes de eso. Esta pregunta se ha citado como duplicación [kfifo use of define] (http://stackoverflow.com/questions/16117304/why-is-kfifo-h-so-full-of-define-statements). Si ** MS-Windows ** es la razón por la que las personas dicen que esta macro es razonable, ¿cómo están relacionadas? –