2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Die C-Sprache legt einige vordefinierte Symbole fest, die direkt verwendet und während der Vorverarbeitung verarbeitet werden können.
__FILE__//进行编译的源文件
__LINE__//文件当前的行号
__DATE__//文件被编译的日期
__TIME__//文件被编译的时间
__STDC__//如果编译器遵循ANSI C,其值为1,否则未定义
Testergebnisse:
#define wird verwendet, um die Definition zu schreiben, wenn eine Konstante definiert wird:
#define MAX 100
Die logische Regel besteht darin, MAX direkt durch 100 zu ersetzen, wenn er im folgenden Code erscheint. Dieser Operationsschritt wird in der Vorverarbeitungsphase abgeschlossen. Wenn #define zum Definieren einer Konstante verwendet wird, wird der Name im Allgemeinen in Großbuchstaben geschrieben.
Zu verwendende Szenen:
Wenn #define zum Definieren von Makros verwendet wird, ähnelt die Methode der von Funktionen, die Logik ist jedoch Ersetzen. Beim Ersetzen müssen Variablen in Klammern eingeschlossen werden, um Probleme mit der Bedienerpriorität und die daraus resultierenden unerwarteten Ergebnisse zu vermeiden.
Wie benutzt man:
#define MAX(x,y) ((x) > (y) ? (x) : (y))
Dies ist ein Makro, das geschrieben wurde, um die Beurteilung des direkt größeren Werts zweier Zahlen zu vervollständigen. Beachten Sie, dass die Klammern nach dem Makronamen in der Nähe des Makros stehen sollten.
Anwendungsfall:
Durch die beiden oben genannten Fälle können wir feststellen, dass Makros den Typ bei der Übergabe von Parametern nicht einschränken. Wenn die Funktion übergeben wird, ist der Rückgabetyp der Funktion festgelegt und das Makro wird schneller ausgeführt.
Vorteile von Makros:
- 1. Wenn Berechnungen mit wenig Code durchgeführt werden, ist die Arbeitszeit von Makros kürzer als die von Funktionen.
- 2. Noch wichtiger ist, dass die Parameter der Funktion mit bestimmten Typen deklariert werden müssen. Makros können auf verschiedene Typen angewendet werden, die mit > verglichen werden können. Die Art des Makros ist unerheblich.
Nachteile von Makros:
- Bei jeder Verwendung eines Makros wird eine Kopie des Makrodefinitionscodes in das Programm eingefügt. Sofern das Makro nicht relativ kurz ist, kann dies die Länge des Programms erheblich verlängern.
- Makros können nicht debuggt werden.
- Da Makros typunabhängig sind, sind sie nicht streng genug.
- Makros können Probleme mit der Operatorpriorität verursachen und Programme fehleranfällig machen.
Vergleichstabelle von Makros und Funktionen:
Attribute | #define definierte Makros | Funktion |
---|---|---|
Codelänge | Das Makro wird bei jeder Verwendung in das Programm eingefügt.Mit Ausnahme sehr kleiner Makros erhöht sich die Länge des Programms deutlich | Funktionscode erscheint nur an einer Stelle; bei jeder Verwendung wird derselbe Code an dieser Stelle aufgerufen |
Ausführungsgeschwindigkeit | Schneller | Es entsteht ein zusätzlicher Overhead durch Funktionsaufrufe und -rückgaben, der langsamer ist. |
Vorrang des Operators | Makroparameter werden im Kontext aller umgebenden Ausdrücke ausgewertet. Sofern keine Klammern enthalten sind, kann der Vorrang benachbarter Operatoren unvorhersehbare Folgen haben. Daher wird empfohlen, Makros mit mehr Klammern zu schreiben. | Funktionsparameter werden nur ausgewertet und an die Funktion übergeben, wenn die Funktion aufgerufen wird. Ausdrücke werden vorhersehbar ausgewertet. |
Parameter mit Nebenwirkungen | Parameter können an mehreren Stellen im Makrokörper ersetzt werden, und wenn die Parameter eines Makros mehrmals ausgewertet werden, kann die Parameterauswertung mit Nebenwirkungen zu unvorhersehbaren Ergebnissen führen. | Funktionsparameter werden nur bei der Parameterübergabe ausgewertet und sind einfach zu steuern. |
Parametertyp | Die Parameter des Makros haben nichts mit dem Typ zu tun. Solange die Operation an den Parametern zulässig ist, kann sie für jeden Parametertyp verwendet werden. | Die Parameter der Funktion hängen vom Typ ab. Wenn sie unterschiedlich sind, werden unterschiedliche Funktionen benötigt und die Aufgaben sind unterschiedlich. |
debuggen | Das Debuggen von Makros ist unpraktisch | Funktionen können Anweisung für Anweisung debuggt werden |
Rekursion | Makros können nicht rekursiv sein | Makros können nicht rekursiv sein |
Der #Operator wandelt ein Argument eines Makros in ein String-Literal um. Es darf nur in der Ersetzungsliste eines Makros mit Parametern erscheinen.
Die vom #-Operator ausgeführte Operation kann als „Stringifizierung“ verstanden werden.
Anwendungsbeispiel:
## kann die Symbole auf beiden Seiten zu einem Symbol kombinieren, wodurch Makrodefinitionen Bezeichner aus separaten Textsegmenten erstellen können.Kleber für Marker
Eine solche Verbindung muss eine gültige Kennung erzeugen. Ansonsten ist das Ergebnis undefiniert. Lassen Sie uns hier darüber nachdenken. Wenn Sie eine Funktion schreiben, um den größeren Wert zweier Zahlen zu ermitteln, müssen unterschiedliche Funktionen für unterschiedliche Datentypen geschrieben werden.
Anwendungsbeispiel: