Empfehlungen für die Auswahl zwischen Funktionen und Macros
Die meisten Microsoft-Laufzeitbibliotheken-Routinen sind kompilierte oder assemblierte Funktionen, aber einige Routinen werden als Makros implementiert. Wenn eine Headerdatei sowohl die Funktions- als auch Makroversion einer Routine deklariert, hat die Makrodefinition Vorrang, da sie immer auf die Funktionsdeklaration folgt. Wenn Sie eine Routine aufrufen, die sowohl als Funktion als auch als Makro implementiert ist, können Sie den Compiler auf zwei Arten zwingen, die Funktionsversion zu verwenden:
Schließen Sie den Routinennamen in Klammern ein.
#include <ctype.h> a = _toupper(a); // Use macro version of toupper. a = (_toupper)(a); // Force compiler to use // function version of toupper.
Heben Sie die Makrodefinition mit der
#undef
-Richtlinie auf:#include <ctype.h> #undef _toupper
Wenn Sie zwischen einer Funktions- und Makroimplementierung einer Bibliotheksroutine wählen müssen, sollten Sie die folgenden Vor- und Nachteile abwägen:
Geschwindigkeit im Vergleich zur Größe: Der Hauptvorteil der Verwendung von Makros ist die schnellere Ausführung. Während der Vorverarbeitung wird ein Makro bei jeder Verwendung inline (durch seine Definition ersetzt) erweitert. Eine Funktionsdefinition erfolgt nur einmal, unabhängig davon, wie oft sie aufgerufen wird. Makros erhöhen möglicherweise die Codegröße, weisen jedoch keinen Aufwand auf, der Funktionsaufrufen zugeordnet ist.
Die Funktionsauswertung A-Funktion wertet eine Adresse aus; ein Makro nicht. Daher können Sie keinen Makronamen in Kontexten verwenden, die einen Zeiger erfordern. Sie können z.B. einen Zeiger auf eine Funktion, aber keinen Zeiger auf ein Makro deklarieren.
Typüberprüfung: Wenn Sie eine Funktion deklarieren, kann der Compiler die Argumenttypen überprüfen. Da Sie ein Makro nicht deklarieren können, kann der Compiler keine Makroargumenttypen überprüfen. obwohl sie die Anzahl der Argumente überprüfen kann, die Sie an ein Makro übergeben.
Siehe auch
Typgenerische Mathematik
C-Runtime-Dateien (CRT) und C++ Standard Library (STL) .lib