Recomendaciones para elegir entre funciones y macrosRecommendations for Choosing Between Functions and 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.Most Microsoft run-time library routines are compiled or assembled functions, but some routines are implemented as 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.When a header file declares both a function and a macro version of a routine, the macro definition takes precedence, because it always appears after the function declaration. 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:When you invoke a routine that is implemented as both a function and a macro, you can force the compiler to use the function version in two ways:

  • Agregar el nombre de la rutina entre paréntesis.Enclose the routine name in parentheses.

    #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:"Undefine" the macro definition with the #undef directive:

    #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:If you need to choose between a function and a macro implementation of a library routine, consider the following trade-offs:

  • 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.Speed versus size The main benefit of using macros is faster execution time. Durante el preprocesamiento, una macro se expande (reemplazada por su definición) alineada cada vez que se utiliza.During preprocessing, a macro is expanded (replaced by its definition) inline each time it is used. Una definición de función se produce una vez, con independencia de cuántas veces se le llame.A function definition occurs only once regardless of how many times it is called. Las macros pueden aumentar el tamaño del código, pero no tienen la sobrecarga asociada con las llamadas a funciones.Macros may increase code size but do not have the overhead associated with function calls.

  • Evaluación de la función Una función evalúa una dirección, pero una macro no.Function evaluation A function evaluates to an address; a macro does not. Por lo tanto, no se puede utilizar un nombre de macro en contextos que requieren un puntero.Thus you cannot use a macro name in contexts requiring a pointer. Por ejemplo, puede declarar un puntero a una función, pero no un puntero a una macro.For instance, you can declare a pointer to a function, but not a pointer to a macro.

  • Comprobación de tipos Cuando se declara una función, el compilador puede comprobar los tipos de argumentos.Type-checking When you declare a function, the compiler can check the argument types. Como no se puede declarar una macro, el compilador no puede comprobar los tipos de argumentos de las macros, pero sí puede comprobar el número de argumentos transferidos a una macro.Because you cannot declare a macro, the compiler cannot check macro argument types; although it can check the number of arguments you pass to a macro.

Vea tambiénSee also

Math Type-GenericType-generic math
Características de la biblioteca CRTCRT Library Features