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