Heim  >  Artikel  >  Makrodefinitionsfunktion

Makrodefinitionsfunktion

藏色散人
藏色散人Original
2020-05-17 09:44:007345Durchsuche

Makrodefinitionsfunktion

Während der Vorverarbeitung werden alle im Programm vorkommenden „Makronamen“ durch die Zeichenfolgen in der Makrodefinition ersetzt. Dies wird als „Makroersetzung“ oder „Makroersetzung“ bezeichnet. . Die Makrodefinition wird durch den Makrodefinitionsbefehl im Quellprogramm abgeschlossen. Die Makroersetzung erfolgt automatisch durch den Präprozessor. Wenn die Zeichenfolge ein Ausdruck ist, nennen wir sie eine funktionale Makrodefinition.

Nehmen wir die folgenden zwei Codezeilen als Beispiel, um die Beschreibung zu erweitern:

Funktionale Makrodefinition: #define MAX(a,b) ((a)>(b)?(a):(b))

Gewöhnliche Funktion: MAX(a,b) { return a>b?a:b;}

(1) Die durch Funktionsmakros definierten Parameter haben keinen Typ. Der Präprozessor ist nur für die formale Ersetzung verantwortlich und führt keine Parametertypprüfung durch. Seien Sie daher bei der Parameterübergabe besonders vorsichtig.

(2) Achten Sie beim Definieren funktionaler Makros auf das Format, insbesondere auf Klammern.

Wenn die obige Makrodefinitionsfunktion als #define MAX(a,b) (a>b?a:b) geschrieben wird und die inneren Klammern weggelassen werden, ist das Laufergebnis aufgrund der Operatorpriorität danach falsch Makroerweiterung; Wenn die obige Makrodefinitionsfunktion die äußeren Klammern weglässt und die Makrodefinition ++MAX(a,b) ist, dann wird die Makroerweiterung zu ++(a)>(b)?(a):(b) , Die Priorität der Operationen ist ebenfalls falsch.

(3) Wenn der Funktionsparameter ein Ausdruck ist, unterscheidet sich der Ersetzungsprozess des normalen Funktionsaufrufs und der Funktionsmakrodefinition.

Wenn eine normale Funktion aufgerufen wird, wird zunächst der Wert des tatsächlichen Parameterausdrucks ermittelt und dann an den formalen Parameter übergeben. Wenn der tatsächliche Parameterausdruck einen Nebeneffekt hat, treten diese Nebeneffekte nur einmal auf. Beispiel: MAX(++a, ++b): Wenn MAX eine gewöhnliche Funktion ist, werden a und b nur einmal erhöht. Wenn jedoch das Funktionsmakro MAX definiert ist, muss es auf k = ((++a)>(++b)?(++a):(++b)) erweitert werden, a und b jedoch nicht notwendigerweise einmal oder zweimal erhöht. Wenn es sich bei dem Parameter um einen Ausdruck handelt, müssen Sie daher beim Ersetzen der Funktionsmakrodefinition vorsichtig sein.

(4) Die Anweisungen, die durch Kompilierung von Code, der eine echte Funktion aufruft, und Code, der eine funktionale Makrodefinition aufruft, generiert werden, sind unterschiedlich.

Wenn MAX eine gewöhnliche Funktion ist, muss ihr Funktionskörper a > b zurückgeben. Um Anweisungen zu kompilieren und zu generieren, muss auch jeder Aufruf, der im Code erscheint, kompiliert und generiert werden Anweisungen und Anrufanweisungen. Und wenn MAX eine funktionale Makrodefinition ist, muss die Makrodefinition selbst nicht kompiliert werden, um Anweisungen zu generieren, aber die durch die Kompilierung generierten Anweisungen für jeden Aufruf, der im Code erscheint, entsprechen einem Funktionskörper und nicht einigen einfachen Parametern Übergabeanweisungen und Anrufanweisungen. Daher ist die durch die Kompilierung mithilfe der Funktionsmakrodefinition generierte Objektdatei größer.

Vorteile:

Zuallererst bringt der Funktionsaufruf zusätzlichen Overhead mit sich. Er muss einen Stapelplatz öffnen, die Rücksprungadresse aufzeichnen, die formalen Parameter auf den Stapel verschieben und freigeben Dieser Overhead verringert die Codeeffizienz und die Verwendung von Makrodefinitionen ist in Bezug auf Codegröße und Geschwindigkeit besser.

Zweitens müssen die Parameter der Funktion als bestimmter Typ deklariert werden Wenn wir also die Größe zweier Gleitkommatypen vergleichen möchten, müssen wir bei Verwendung in Ausdrücken geeigneter Typen eine Vergleichsfunktion speziell für Gleitkommatypen schreiben. Im Gegenteil, die obige Makrodefinition kann verwendet werden Für Ganzzahlen, lange Ganzzahlen, einzelne Gleitkommatypen, doppelte Gleitkommatypen und andere Typen, deren Werte mit dem Operator „<“ verglichen werden können, haben Makros nichts mit Typen zu tun.

Das obige ist der detaillierte Inhalt vonMakrodefinitionsfunktion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn