Tipps Zur Fehlerbehebung Makrodefinitionen Können Zur Laufzeit Nicht Geändert Werden
August 25, 2021
Empfohlen: Fortect
Dieses Internet-Benutzerhandbuch soll Ihnen helfen, wenn Sie feststellen, dass die Makrosymbolik nicht in einen Wiedergabefehlercode geändert werden kann.Makros werden aus ihren Präprozessorwerten ersetzt, lange bevor Ihre Lieblingsquelldatei überhaupt kompiliert wird. Es gibt keine Möglichkeit, den gesamten Wert Ihres aktuellen Makros zur Laufzeit zu ändern. Wenn Sie noch ein bisschen mehr über das Ziel erklären könnten, das Sie definitiv zu generieren versuchen, gibt es eine andere Möglichkeit, Ihr Problem zu verbessern und sogar zu beseitigen, das keine Makros enthält.
Neigung
Sie ändern die verschiedenen Makros selbst; H. was es bietet, können Sie einfach die Bedeutung im Zusammenhang mit dem inklusiven Konzept ihres Makros ändern. Für ein sehr absurdes Beispiel:
#include #define UNCHANGEABLE_VALUE 5#define CHANGEABLE_VALUEfooint foo = 5;int main () printf ("% d% n", CHANGEABLE_VALUE); unveränderbarer_Wert, CHANGEABLE_VALUE ist wahrscheinlich 10; printf ("% d% d n", CHANGEABLE_VALUE); unveränderlicher_Wert,
Daher hängt die Antwort auf Ihr Feld von der Art der Zerstörung ab, die Ihre Änderung für den Codetyp verursachen sollte, der die meisten von Ihnen verwendet, das Makro.
Natürlich sind -Techniken
Kompilierungszeit, obwohl Sie verstehen, dass sie konstant ist und foo
es oft nicht ist, daher wird es nicht funktionieren, wenn Sie planen, zu entlüften WERT immer als
case
Label.
Denken Sie daran, dass es zwei (eigentlich mehr) Sprachübersetzungszeiten für das primäre Element C gibt. Innerhalb des ersten (von diesem Interesse) gibt es zusätzliche Makros. Sobald dies alles erledigt ist, wird jedes Prepare "geparst und semantisch" verglichen mit help 5.1.1.2/2. Diese Schritte werden oft als „Vorverarbeitung“ und „Kompilieren“ gesendet (obwohl ein neuer Übersetzungsprozess in der Regel auch mehrdeutig ist und allgemein als „Kompilieren“ bezeichnet wird). Sie können sogar von separaten Programmen gefolgt werden, wobei der eigentliche "Compiler" als "Präprozessor" fungiert, wenn es sein muss, bevor Sie etwas anderes tun. Daher ist eine Ausführung bereits so, dass es zu spät ist, zurückzugehen und zu ändern, was das Makro zur weiteren Ausführung anzeigt.
Der Präprozessor unterstützt das Ersetzen von Textmakros. Auch die Ablösung des Funktionstyps geschriebener Textmakros sollte unterstützt werden.
Syntax
#define
ID-Ersetzungsliste (optional) #define
ID (
Spezifikationen )
Ersetzungsliste (optional) #define
Parameter , Bezeichner (
...)
Ersetzungsliste (optional) #define
Bezeichner (...)
Ersatzsatz (optional) Nummer undef id
Erläuterung
Anweisungen #define
Die #define
-Direktiven erklären diesen Bezeichner als Makro, was oft ist, sie fragen diesen Compiler - ersetzen Sie alle sequentiellen Bezeichner und Bezeichner von Vorkommen, wenn eine Ersetzungsliste, die eventuell noch weiterverarbeitet werden könnten. Wenn die Patienten-ID bereits als tatsächlich existierender Makrotyp definiert ist, liegt ohne Zweifel ein Fehler im Programm vor, es sei denn, die Definitionen waren nicht unterscheidbar.
Objekttyp-Makros
Objekttyp-Makros ersetzen fast alle Komplikationen, die durch Bezeichner in der Erneuerungsliste definiert sind. (1) Die Version von i würde sagen, dass sich die #define
-Anweisung genauso verhält.
Funktionstyp-Makros
Makros vom Funktionstyp ersetzen jedes einzelne Vorkommen eines durch Trennzeichen getrennten Bezeichners dank einer optionalen Ersetzungsliste mit einer anderen Reihe von Argumenten, die dann das entsprechende Vorkommen eines von . reparieren a die Parameter der Ersetzungsliste.
Das Format zum Aufrufen eines Funktionsklassifizierungsmakros ist dem Aufrufen eines Prozesses sehr ähnlich: jede Instanz zeigt auf Ihren aktuellen Makronamen, gefolgt von (also ist das nächste Vorverarbeitungstoken jetzt eine Sequenz von Token, die ungefähr so dargestellt werden Liste der Ersetzungen. Die TV-Serie endet auch mit dem ergänzenden Zeichen Lom), bei dem Zwischenrahmenpaare links, einschließlich eckiger Befestigungsklammern, und rechte Klammern ignoriert werden.
Für Version (2) sollte diese Anzahl guter Gründe ungefähr der Anzahl der Aspekte in der Makroübersicht entsprechen. Bei Modulen (3,4) sollte die Anzahl der zugehörigen Argumente immer wünschenswerter sein (bis C++ 20), zumindest gleich (ab C++ 20) als der Prozentsatz der Features (ohne . ..
). Andernfalls wird das Programm schlecht geordnet. Wenn der Identifikator einer Person wirklich in funktionaler Notation ist, also keine eckigen Klammern hinter dieser Methode stehen, wird nicht alles neu erstellt. (2)
Die Version jeder #define
Direktive beschreibt ein einfaches Makro eines funktionalen Typs.
Version (3) der Anweisung #define
gibt an, dass es für Sie einfacher ist, Makros mit variablen Zahlenargumenten entwickeln zu lassen. Zusätzliche Argumente (genannt Aspektargumente) sind die, die mit einem Bezeichner __VA_ARGS__
gefunden werden können, was dann durch Inkongruenzen ersetzt wird, die mit einem automatisch ersetzten Bezeichner zurückgegeben werden.
Version (4) der #define
wichtigen Informationen definiert eine Funktion von Hundemakros mit einer anderen Anzahl von Argumenten, ohne jedoch die üblichen Probleme zu haben. (Named Argument Distinguishing Arguments) sind nur verfügbar, wenn sie den Bezeichner __VA_ARGS__
haben können, der dann in den aktuell zu ersetzenden Argumenten ersetzt wird.
![Makroinformationen können zur Laufzeit nicht geändert werden](https://www.ultraedit.com/wiki/images/4/43/UltraEdit_edit_create_macro.png)
Bei den Versionen (3, 4) könnte das Ersetzungsverzeichnis wahrscheinlich eine Sequenzphrase __VA_OPT__ (
content ) enthalten < /code>, das oft durch den bereitgestellten Inhalt ersetzt wird.
__VA_ARGS__
ist einer der am meisten nicht leeren und erweitert sich zu nichts anderem.
#define F (...) f (0 __VA_OPT __ (,) __VA_ARGS__)# definiere g (x, ...) p (0, __VA_OPT __ (,) a __VA_ARGS__)#define SDEF (Name, ...) S bezeichnen __VA_OPT __ (= __VA_ARGS__)F (a, utes, c) // ersetzt durch c (0, a passend, b, c)F () // ausgeschaltet mit f (0)G (a, s, c) // ersetzt durch f ree p (0, a, b, c)G (a,) // aufgefüllt erstellt von f (0, a)G (a) // durch f ersetzen (0, a)SDEF (foo); // ersetzt durch S foo;SDEF (Spalten, 1, 2); // ersetzt, dass S bar = 1 hat, dein Paar;
Hinweis: Wenn ein Makroargument eines bestimmten Fähigkeitstyps Kommas enthält, die wahrscheinlich nicht durch übereinstimmende Paare in linken und rechten Klammern geschützt sind (die meisten daran angehängten treten manchmal in Vorlagenargument-Mailinglisten auf, wie in assert (std :: is_same_v < int, int>); oder BOOST_FOREACH (std :: Paar von Slip-Ons
Reservierte Makronamen
Eine Kommunikationsübersetzungseinheit, die den Standardvorrat für h2-Tags enthält, sollte keinen Namen #define
#undef
in der Standard-Schlagzeilenbibliothek angeben.
Eine Übersetzungseinheit, die den Zweck der Standardbibliothek verwendet, darf lexikalisch nicht mehr mit #define
oder #undef
identisch sein:
- Schlüsselwörter
Abgesehen davon, dass potenziell
und unwahrscheinlich
oft als spezielle Funktionsmakros angegeben werden.
Zahl
und ##
Operatoren
Empfohlen: Fortect
Sind Sie es leid, dass Ihr Computer langsam läuft? Ist es voller Viren und Malware? Fürchte dich nicht, mein Freund, denn Fortect ist hier, um den Tag zu retten! Dieses leistungsstarke Tool wurde entwickelt, um alle Arten von Windows-Problemen zu diagnostizieren und zu reparieren, während es gleichzeitig die Leistung steigert, den Arbeitsspeicher optimiert und dafür sorgt, dass Ihr PC wie neu läuft. Warten Sie also nicht länger - laden Sie Fortect noch heute herunter!
![](/wp-content/download2.png)
In funktionalen Makros, jede Art von Inhaber #
vor einem führenden Bezeichner in der Liste der Ersetzungen potenzieller Kunden jeden Bezeichner durch einen Parameter ersetzen, und das Ergebnis von Clos ist in Anführungszeichen geraten, wodurch effektiv eine weitere Zeichenfolge erstellt wird. ... Darüber hinaus fügt Ihr spezifischer Präprozessor den neuen umgekehrten Schrägstrich hinzu, um Anweisungen um Inline-Schnurliterale zu verbergen, falls berücksichtigt, kombiniert mit doppelten umgekehrten Schrägstrichen für diesen bestimmten Satz, falls erforderlich. Alle führenden und abschließenden Leerzeichen werden entfernt, und eine gute bestimmte Abfolge von Leerzeichen in der Mitte des Textes (aber keinesfalls in Inline-String-Literalen) wird reduziert, sodass Sie ein bestimmtes Personen-Leerzeichen verwenden können. Dies wird als "Stringifizierung" bezeichnet. Wenn das Ergebnis aller String-Verkäufe ungültig ist Is, String, ist ein Verhalten undefiniert.
Laden Sie diese Software herunter und reparieren Sie Ihren PC in wenigen Minuten.
![Gary Lamb](https://dosgeek.com/wp-content/uploads/garylamb.jpg)