Funções embutidas em comparação com macros
Embora as funções integradas sejam semelhantes a macros (porque o código da função é expandido no ponto de chamada em tempo de compilação), as funções integradas são analisadas pelo compilador, enquanto que as macros são expandidas pelo pré-processador. Como resultado, há várias diferenças importantes:
As funções integradas seguem todos os protocolos de segurança de tipo impostos em funções normais.
As funções integradas são especificadas usando a mesma sintaxe que qualquer outra função, exceto que incluem a palavra-chave inline na declaração da função.
As expressões transmitidas como argumentos para as funções integradas são avaliadas uma única vez. Em alguns casos, as expressões transmitidas como argumentos para macros podem ser avaliadas 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 do dispositivo de console (stdin) e, se necessário, convertido em maiúsculas.
Devido à implementação da macro, getc é executado uma vez para determinar se o caractere é maior que ou igual a "a" e para determinar uma vez se ele é menor ou igual a "Z". Se estiver nesse intervalo, getc será executado novamente para converter o caractere para letras maiúsculas. Isso significa que o programa espera por dois ou três caracteres quando, de modo ideal, ele deve esperar apenas um.
As funções integradas corrigem 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 );
}