Ordnet ein Makro Speicher in einem Segment zu? Wenn ja, in welchem Speichersegment ist NUMBER
gespeichert?Ordnet ein Makro Speicher zu?
#define NUMBER 10
Ordnet ein Makro Speicher in einem Segment zu? Wenn ja, in welchem Speichersegment ist NUMBER
gespeichert?Ordnet ein Makro Speicher zu?
#define NUMBER 10
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.
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.
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.
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.
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.
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. [...]
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" _ –
'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
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