Freigeben über


Inlinefunktionen mit Makros

Obwohl Inlinefunktionen für Makros vergleichbar sind (weil der Funktionscode zum Zeitpunkt des Aufrufs zur Kompilierzeit Inlinefunktionen erweitert wird), werden vom Compiler beim Analysieren von Makros vom Präprozessor erweitert werden.Daher gibt es einige wichtige Unterschiede:

  • Inlinefunktionen folgen alle Protokolle auf normalen Fähigkeiten der Typsicherheit erzwungen.

  • Inlinefunktionen werden mit derselben Syntax wie jede andere Funktion angegeben, außer dass sie gehören inline-Schlüsselwort in der Funktionsdeklaration.

  • Die Ausdrücke, die als Argumente an Inlinefunktionen übergeben werden, werden einmal ausgewertet.In einigen Fällen können die Ausdrücke, die als Argumente übergeben werden, für Makros mehrmals ausgewertet werden.

Beispiel

Im folgenden Beispiel wird ein Makro, das Kleinbuchstaben in Großbuchstaben konvertiert:

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

Der Zweck des Ausdrucks toupper(getc(stdin)) besteht darin, dass ein Zeichen aus demstdin), (Konsole gelesen und ggf. in Großbuchstaben konvertiert werden soll.

Aufgrund der Implementierung des Makros, wird getc einmal, um zu bestimmen, ob das Zeichen größer oder gleich „a“ hat, einmal ausgeführt und zu bestimmen, ob er ist kleiner oder gleich „Z“. Wenn er in diesem Bereich liegt, wird getc erneut aus, um das Zeichen in Großbuchstaben konvertiert werden soll.Dies bedeutet, dass das Programm auf zwei oder drei Zeichen wartet auf ideal, wenn nur ein warten soll.

Problembehandlung bei Inlinefunktionen das zuvor beschriebene Problem:

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

Siehe auch

Referenz

inline, __inline, __forceinline