Compartir a través de


Funciones inline con macros

Aunque las funciones inline son similares a las macros (porque el código de función se expanda actualmente la llamada en tiempo de compilación), las funciones inline son analizadas por el compilador, mientras que las macros se expandieron por el preprocesador.Como resultado, hay varias diferencias importantes:

  • Las funciones inline siguen todos los protocolos de seguridad tipo aplicada en funciones normales.

  • Las funciones inline se especifican utilizando la misma sintaxis que cualquier otra función salvo que incluyen la palabra clave de Alineado en la declaración de función.

  • Las expresiones pasadas como argumentos a las funciones inline se evalúan una vez.En algunos casos, las expresiones pasadas como argumentos a las macros se pueden evaluar varias veces.

Ejemplo

El ejemplo siguiente se muestra una macro que convertir minúsculas a mayúsculas:

// inline_functions_macro.c
#include <stdio.h>
#include <conio.h>

#define toupper(a) ((a) >= 'a' && ((a) <= 'z') ? ((a)-('a'-'A')):(a))

int main() {
   char ch;
   printf_s("Enter a character: ");
   ch = toupper( getc(stdin) );
   printf_s( "%c", ch );
}
  
  

El propósito de la expresión toupper(getc(stdin)) es que un carácter se deben leer del dispositivo de consola (stdin) y, si es necesario, convertir a mayúsculas.

Debido a la implementación de la macro, getc se ejecuta una vez para determinar si el carácter mayor o igual que “a”, y para determinar una vez si es menor o igual que “Z”. Si está en ese intervalo, getc se ejecuta de nuevo para convertir el carácter a mayúsculas.Esto significa que el programa espera dos o tres caracteres cuando, idealmente, debe esperar uno solo.

Las funciones inline remedian el problema descrito previamente:

// inline_functions_inline.cpp
#include <stdio.h>
#include <conio.h>

inline char toupper( char a ) {
   return ((a >= 'a' && a <= 'z') ? a-('a'-'A') : a );
}

int main() {
   printf_s("Enter a character: ");
   char ch = toupper( getc(stdin) );
   printf_s( "%c", ch );
}
  
  

Vea también

Referencia

inline, __inline, __forceinline