Compartilhar via


Funções embutidas em vez de Macros

Embora funções embutidas são semelhantes às macros (porque o código de função é expandido no ponto da chamada em tempo de compilação), funções embutidas são analisadas pelo compilador, ao passo que as macros são expandidas no pré-processador.Como resultado, há várias diferenças importantes:

  • Funções embutidas siga todos os protocolos de segurança de tipos impostas em funções normais.

  • Funções embutidas são especificadas usando a mesma sintaxe como qualquer outra função, exceto que eles incluem o in-line palavra-chave na declaração da função.

  • Expressões passadas como argumentos para funções embutidas são avaliadas de uma vez.Em alguns casos, a expressões passadas como argumentos para macros podem ser avaliadas de mais de uma vez.

Exemplo

O exemplo a seguir mostra uma macro que converte letras minúsculas em maiú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 );
}
  
  

A intenção da expressão toupper(getc(stdin)) é que um caractere deve ser lido a partir do dispositivo de console (stdin) e, se necessário, convertidos em maiúsculas.

Por causa da implementação da macro, getc é executado uma vez para determinar se o caractere é maior que ou igual a "a" e depois para determinar se ele é menor ou igual a "z". Se ele estiver nesse intervalo, getc é executado novamente para converter o caractere em maiúscula.Isso significa que o programa aguarda para dois ou três caracteres quando, o ideal é que ele deve esperar para que apenas um.

Funções embutidas remediar o problema descrito anteriormente:

// 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 );
}
  
  

Consulte também

Referência

inline, embutido, __forceinline