Recomendaciones para elegir entre funciones y macros

La mayoría de las rutinas de la biblioteca en tiempo de ejecución de Microsoft son funciones compiladas o ensambladas, aunque algunas rutinas se implementan como macros. Cuando un archivo de encabezado declara una función y una versión de macro de una rutina, la definición de macro tiene prioridad, porque siempre aparece después de la declaración de función. Cuando se invoca una rutina que se implementa como una función y como una macro, puede forzar al compilador a que utilice la versión de función de dos maneras:

  • Agregar el nombre de la rutina entre paréntesis.

    #include <ctype.h>
    a = _toupper(a);    // Use macro version of toupper.
    a = (_toupper)(a);  // Force compiler to use
                        // function version of toupper.
    
  • "Anular la definición" de la macro con la directiva #undef:

    #include <ctype.h>
    #undef _toupper
    

Si tiene que elegir entre una función y una implementación de la macro de una rutina de la biblioteca, tenga en cuenta las ventajas y desventajas siguientes:

  • Velocidad frente a tamaño El principal beneficio del uso de las macros es que ofrece un tiempo de ejecución más rápido. Durante el preprocesamiento, se expande una macro (reemplazada por su definición) insertada cada vez que se usa. Una definición de función solo se produce una vez independientemente de cuántas veces se llame. Las macros pueden aumentar el tamaño del código, pero no tienen la sobrecarga asociada a las llamadas de función.

  • Evaluación de funciones Una función se evalúa como una dirección; una macro no. Por lo tanto, no se puede usar un nombre de macro en contextos que requieran un puntero. Por ejemplo, puede declarar un puntero a una función, pero no un puntero a una macro.

  • Comprobación de tipos Cuando se declara una función, el compilador puede comprobar los tipos de argumentos. Dado que no se puede declarar una macro, el compilador no puede comprobar los tipos de argumentos de macro; aunque puede comprobar el número de argumentos que se pasan a una macro.

Consulte también

Matemáticas de tipo genérico
Archivos .lib de tiempo de ejecución de C (CRT) y biblioteca estándar de C++ (STL)