2016-07-05 4 views
3

Ordnet ein Makro Speicher in einem Segment zu? Wenn ja, in welchem ​​Speichersegment ist NUMBER gespeichert?Ordnet ein Makro Speicher zu?

#define NUMBER 10 
+1

Von: https://gcc.gnu.org/onlinedocs/cpp/Object-like-Macros.html#Object-like-Macros. _ "Ein objektähnliches Makro ist ein einfacher Bezeichner, der durch ein Codefragment ersetzt wird ... dann erkennt und erweitert der C-Präprozessor das Makro ... C-Compiler sieht die gleichen Tokens wie wenn Sie geschrieben hätten" _ –

+1

'NUMBER' weist dynamischen Speicher zur Kompilierzeit zu (im Heap des Compilers). Es gibt keine Zuordnung im kompilierten Programm - zumindest nicht für das Makro. – i486

+0

Nun, um pedantisch zu sein, wird es Speicher in '.text' ([code segment] (https://en.wikipedia.org/wiki/Code_segment)) Abschnitt belegen. ;) Für jedes Mal wird es im Code verwendet. – LPs

Antwort

7

Nein, Makros funktionieren nicht so.

Sie werden durch den Präprozessor ersetzt. Der Compiler bekommt NUMBER nicht zu sehen. Alles, was es sehen wird, ist das wörtliche 10.

In dieser Hinsicht sind C und C++ identisch.

3

Kein Speicher ist für das Makro reserviert. Beim Kompilieren des Codes wird das Makro an allen Stellen, an denen es verwendet wird, mechanisch durch seinen Wert ersetzt.

1

Diese Definition reserviert keinen Speicher in Ihrem Programm.

Es teilt nur dem Präprozessor (Teil des Compilers) mit, weitere Instanzen des Tokens NUMBER durch 10 zu ersetzen.

Es reserviert wahrscheinlich einige Bytes in dem Präprozessor jedoch.

1

A #define selbst keine Speicher in Anspruch nimmt, ist passiert, was der Compiler - während der ersten Stufe Vorkompilierung - ersetzt alle Vorkommen von NUMBER in Ihrem Code mit der Definition, in Ihrem Fall 10.

2

Nein, Makro weist den Speicher nicht zu.

Diese Anweisungen sind nicht wie Variablenzuweisung, kein Speicher ist zugewiesen. Denken Sie daran, dass der Vorprozessor vor der Kompilierung wirkt.

NUMBER ist nur in pre-processing Stufe relevant und hat zur Laufzeit keine Identität. Während der Vorverarbeitung werden alle Instanzen von NUMBER durch 10 ersetzt. Daher ist zur Laufzeit keine Speicheranforderung erforderlich, da 10 ein Ganzzahlliteral (Kompilierzeit) ist.

Bitte lesen Sie die Referenz link.

2

Nein, im Allgemeinen eine #define Direktive nicht zuweisen Speicher als solche.

Um zu erarbeiten, #define ist eine Ersatzrichtlinie. Es ist lediglich ein Textaustausch während der Vorverarbeitungsphase.

Also, ein Textcode wie

#define NUMBER 10 
. 
. 
. 
if (val == NUMBER) 

sieht aus wie

if (val == 10) 

nach der Vorverarbeitung. Die durch #define definierte MACRO-Substitution benötigt keinen separaten Speicher. FWIW, Der Ersatzwert (Literalwert) wird normalerweise im Codebeispiel () verwendet, als ob Sie das spätere Format mit direktem Fließkommawert ohne MCARO geschrieben hätten.

Verwandte, von C11, Kapitel §5.1.1.2/p4, Translation Phasen

Preprocessing Richtlinien ausgeführt werden, werden Makro Anrufungen erweitert und _Pragma unärer Operator Ausdrücke ausgeführt werden. [...]