Sdílet prostřednictvím


Vložené funkce versus makra

Přestože jsou vložené funkce podobné makrům (protože je kód funkce rozšířen v místě volání v době kompilace), vložené funkce jsou analyzovány pomocí kompilátoru, kdežto makra jsou analyzována pomocí preprocesoru.V důsledku toho existuje několik důležitých rozdílů:

  • Vložené funkce následují všechny protokoly bezpečnosti typů vynucené normálními funkcemi.

  • Vložené funkce jsou zadány pomocí stejné syntaxe jako ostatní funkce, s tím rozdílem, že obsahují v deklaraci funkce klíčové slovo inline.

  • Výrazy předané jako argumenty vložených funkcí jsou vyhodnoceny jednou.V některých případech mohou být výrazy, které jsou předány jako argumenty makrům, vyhodnoceny více než jednou.

Příklad

Následující příklad ukazuje makro, které převádí malá písmena na velká písmena:

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

Záměr výrazu toupper(getc(stdin)) je, že by znak měl být přečten z konzoly zařízení (stdin) a v případě potřeby převeden na velká písmena.

Z důvodu implementace tohoto makra je funkce getc provedena jednou pro určení, zda je znak větší než nebo roven znaku „a“ a poté jednou pro rozhodnutí, zda je menší než nebo roven znaku „z“. Pokud je v tomto rozsahu, je funkce getc zavolána znovu pro převedení znaku na velká písmena.To znamená, že program čeká na dva nebo tři znaky, když v ideálním případě by měl čekat pouze na jeden znak.

Vložené funkce napravují výše popsaný problém:

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

Viz také

Referenční dokumentace

inline, __inline, __forceinline