Es gibt viele Stellen zum Definieren eines Makros. Wenn das Makro in unserem eigenen Projekt von uns definiert wird, ist es einfach, die Definitionsposition dafür zu finden. Aber wenn ich versuche, ein berühmtes Open-Source-Projekt zu lernen, werde ich häufig von der Frage geplagt: Wo finde ich die Quelle der Makros, wenn ich ihre Definition nicht bekomme, werde ich einige von ihnen nicht verstehen (zB einige von ihnen lässt sich anhand des Namens erraten). zum Beispiel eine Aussage von Apache:
Soweit ich weiß, weiß ich, dass es einen möglichen Ursprungsort für ein Makro gibt:
aus diesem Projekt selbst, in einer Quelldatei (dies ist am einfachsten, weil wir es mit einem Tool finden können)
Aus einer Header-Datei einer 3. Bibliothek können wir sie grep
aus der c/c++ Standard-Header-Datei (wo sind sie in Linux?)
aus dem Betriebssystem (wo sind sie in Linux?)
automatisch vom Konfigurationstool generiert (es ist bitter, ich habe keine Ahnung)
aus dem Compiler-Tool wie gcc/g++ oder im Makefile können wir ein Makro definieren
Ich habe eine Frage zu konsultieren:
Wie kann man sie zwischen os-definierten und gcc/g++-definierten und vom Konfigurationstool generierten Makros unterscheiden? Haben sie jeweils bestimmte Eigenschaften?
Wie finde ich die Quelle der von OS oder Standard-C oder Compiler definierten? zB mit grep oder find Dienstprogramme
was bedeutet es, wenn ein Makro wie z __strange___ kann nicht durch Kämmen der gesamten Maschine gefunden werden (cd /;grep __strange___ -r)?
Danke, dass Sie das Prinzip und die Methode erklärt haben, sie zu unterscheiden und ihre Quelle zu finden!
Jede anständige IDE sollte Ihnen bei der Suche helfen irgendein Symbolname nicht nur ein Makroname. Source Insight ist ein solches Codeanalysetool.
– Alok Speichern
29. Juni 2012 um 7:06 Uhr
@Als: irgendein ist etwas stark. Symbole, die in einem Makefile erstellt und als Befehlszeilenargumente übergeben werden, können sehr schwer zu finden sein. Symbole, die in einem Programm generiert werden, das den Compiler über aufruft exec möglicherweise nur über RTFM zu finden.
– David Hamm
29. Juni 2012 um 8:40 Uhr
@DavidHammen; Wir sprechen offensichtlich von Symbolnamen, die eine IDE oder ein Tool sind kann sehen.Ich denke, dass es eine Selbstverständlichkeit ist.
– Alok Speichern
29. Juni 2012 um 8:58 Uhr
Source Insight ist ein solches Code-Analyse-Tool ——– hallo, Als, Source Insight kann diese Makros nur innerhalb des Projekts finden, es kann keine Makros finden, die durch os- und c-Standard-Header und andere definiert sind. Wenn ich falsch liege Können Sie mir an dieser Stelle sagen, wie man es benutzt? tks
– Basketballneuling
29. Juni 2012 um 23:49 Uhr
Eine einfache und schnelle Methode, um herauszufinden, wo ein Makro definiert wurde, besteht darin, das Makro neu zu definieren und die Warn-/Fehlermeldung des Compilers zu überprüfen.
Dies scheint standardmäßig nicht mit gcc zu funktionieren. Ist es notwendig, eine Ausführlichkeitseinstellung zu aktivieren? gcc beschwert sich nur über die Neudefinition, gibt aber keinen Hinweis
– Brydon Gibson
6. Juli um 16:10 Uhr
David Hammen
Wie kann man sie zwischen os-definierten und gcc/g++-definierten und vom Konfigurationstool generierten Makros unterscheiden? Haben sie jeweils bestimmte Eigenschaften?
Die überwiegende Mehrheit ist irgendwo in einer Header-Datei definiert. gcc -dN -E kann hier weiterhelfen. Vorbehalt: Wenn Sie diesen Ansatz verwenden, müssen Sie aufrufen gcc -dN -E mit den gleichen include-Pfade, die gleichen -D<name> Befehlszeilenoptionen, dieselben Umgebungsvariablen wie z CPATH…, wie Sie es tun, wenn Sie Ihre Quelle in Objektdateien kompilieren.
Wie finde ich die Quelle der von OS oder Standard-C oder Compiler definierten? zB mit grep oder Find Utilities
RTFM. Lesen Sie die feine Anleitung.
was bedeutet es, wenn ein Makro wie z __strange__ kann nicht durch Kämmen der gesamten Maschine gefunden werden (cd /;grep __strange___ -r)?
Es könnte einfach bedeuten, dass dieses Symbol auf Ihrem Computer nicht definiert ist. Angenommen, der fragliche Code stammt aus einem Open-Source-Paket, das auf eine Schiffsladung verschiedener Systeme und verschiedener Compiler abzielt, von denen einige nicht ganz mit dem C++-Standard kompatibel sind. Der typische Ansatz ist zu verwenden #ifdef __some_bizarre_os__ in wichtigen Teilen des Codes. Dieses Symbol wird nur auf Computern definiert, auf denen das Bizarre-Betriebssystem ausgeführt wird – nicht auf Ihrem.
Leider ist das nicht der einzige Fall. Das Symbol könnte gut definiert sein, auch wenn Ihr grep es nirgendwo finden kann. Das Makefile könnte zwei Strings verketten, -D__str und ange__ um ein einzelnes Befehlszeilenargument für den Compiler zu bilden. Die Option -D__strange__ könnte sich in einer Ihrer Umgebungsvariablen, die vom Makefile verwendet werden, gut sichtbar verstecken. Die ~/.tcshrc-Dateien, die einige Projekte vorschreiben, können unglaublich verworren sein.
Aktualisieren gcc -dM -E zeigt die Definitionen der Makros, aber nicht wo sie definiert wurden. Eine viel bessere Optionen ist zu verwenden gcc -dN -E und dann Zeilen herausfiltern, die nicht mit einem Anfangsbuchstaben beginnen #.
RTFM. Lesen Sie die feine Anleitung. __bitte um Verzeihung, du meinst die Manpage für “find”, würdest du mir eine einfache Demo zeigen, um ein seltsames Makro zu finden?
– Basketballneuling
30. Juni 2012 um 0:23 Uhr
Hat jeder Makrotyp eine Funktion in seiner Erscheinung? Gibt es zB eine Regel wie: Makros, die von os definiert werden, beginnen mit “_”, und eine andere Art beginnt mit einem Unterstrich “” und so weiter?
– Basketballneuling
30. Juni 2012 um 0:26 Uhr
@ user624866 – Die Handbücher oder Manpages, die Sie lesen müssen, sind die für den Compiler. Beispiel: gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html . In Bezug auf Makros mit führenden doppelten Unterstrichen oder einem führenden Unterstrich gefolgt von einem Großbuchstaben: Dies sind reservierte Namen, die für die Verwendung durch den Hersteller reserviert sind (die Autoren des Compilers, das Team, das Ihre Linux-Distribution erstellt hat). Beachten Sie gut: Nicht jeder hält sich an diese Regel.
– David Hamm
30. Juni 2012 um 14:44 Uhr
David Hammen ————wofür steht die Abkürzung “RTFM”? (Bitte um Verzeihung, ich bin Chinese, kein englischer Muttersprachler)
– Basketballneuling
7. Juli 2012 um 8:05 Uhr
Das Makefile könnte zwei Strings verketten___mehrere Freunde haben dies erwähnt, kann hier jemand ein Beispiel geben?
– Basketballneuling
7. Juli 2012 um 8:06 Uhr
Pizza
Vom gcc-Compiler definierte Makros können angezeigt werden
gcc -dM -E a.c
Abgesehen davon stammen sie alle aus enthaltenen Dateien und Quellen.
Wenn Sie das Makro nicht finden können, bedeutet dies, dass die Bedingung als falsch ausgewertet wird.
Sie können auch die Option -v verwenden, sie zeigt, wo es seine standardmäßigen Include-Verzeichnisse findet.
So finden Sie heraus, aus welcher Datei das Makro stammt:
Sie können auch auf der Befehlszeile für gcc definiert werden. gcc -DFOO=BAR ... definiert das FOO-Makro.
– Michael Anderson
29. Juni 2012 um 7:23 Uhr
Wenn Sie sie in die Befehlszeile einfügen, wissen Sie bereits, was sie sind.
– Pizza
29. Juni 2012 um 7:23 Uhr
Nicht, wenn sie von Ihrem Anwendungs-Build-System dorthin gebracht werden.
– Michael Anderson
29. Juni 2012 um 7:37 Uhr
@pizza: Sehr oft wird die Befehlszeile erstellt, indem die Compiler- und Linker-Flags der von Ihnen verwendeten Bibliotheken verkettet werden. zum Beispiel durch Verketten der CXXFLAGS wie sie von Python, Perl oder anderen Bibliotheken, die Sie verwenden, bereitgestellt werden.
– Frerich Raabe
29. Juni 2012 um 7:49 Uhr
Betreff Sie stammen alle aus enthaltenen Dateien und Quellen – Nicht immer. Ein Tool, das den Compiler aufruft, kann beim Aufruf Symbole definieren exec. #ifdef SWIG ist ein gutes Beispiel.
– David Hamm
29. Juni 2012 um 8:33 Uhr
Wie andere sagten, gcc mit einem von -d Optionen verwendet werden sollten Finden Sie heraus, wo das Makro definiert ist. Diese Optionen werden nicht von ausgegeben gcc -v --helpalso müssen sie mit gelesen werden das HandbuchKapitel 3.11suchen nach -dCHARS.
Schließlich sind meine Schritte:
Verwenden gcc ... -E -dD
Suchen Sie die Definition in der Ausgabedatei
Suchen Sie rückwärts nach # (ein Hash und ein Leerzeichen), um die Datei anzuzeigen
Kinjal Patel
Es sieht so aus, als wären diese Makros Kompilierungskonstanten.
Es empfiehlt sich, solche Makros zu verwenden, um dem Compiler mitzuteilen, dass dieser Teil des Codes kompiliert werden muss und dieser Teil des Codes nicht kompiliert werden soll.
Wenn Sie sie nicht in Ihrem Projektarbeitsbereich suchen können, sollten Sie den Programmablauf durchgehen und entscheiden, welcher Teil des Codes von Ihrer Anwendung benötigt wird, und das entsprechende Makro definieren.
jetzt im obigen Beispiel, wenn der Code unter abgedeckt ist _CASE1_ für Ihre Anwendung erforderlich ist, müssen Sie diese definieren _CASE1_. z.B #define _CASE1_
ich hoffe es hilft…
Wenn Sie ein Open-Source-Projekt studieren, gehe ich davon aus, dass Sie es so eingerichtet haben, dass Sie es erstellen können. Wählen Sie eine Datei aus, die das gesuchte Makro enthält, und verwenden Sie Ihren Compiler, um eine vorverarbeitete Datei zu generieren. Die tatsächliche Option hängt vom verwendeten Compiler ab, es ist -E für gcc, Sie können einige weitere Informationen finden hier.
Beachten Sie, dass Sie wahrscheinlich das Build-System Ihres Projekts verwenden müssen, um Ihre Datei tatsächlich zu kompilieren und zu sehen, welche Optionen Sie benötigen, damit die Ausführung des Präprozessors erfolgreich ist.
Sobald Sie Ihre vorverarbeitete Datei haben, suchen Sie einfach nach Ihrem Makro. Es gibt Präprozessoroptionen, die den Pfadnamen für jede enthaltene Datei generieren.
UPDATE: Dieser Ansatz funktioniert offensichtlich nicht, da Ihr Makro um den Prozessor erweitert wird. Wenn Sie also nicht seine erweiterte Form oder seine Auswirkungen erkennen können, wäre es von geringem Nutzen.
Etwas nützlicher könnte es sein, den Compiler dazu zu bringen, die genaue Reihenfolge der enthaltenen Dateien auszugeben. Dies wird in gcc mit der Option -H erreicht.
Gabi
Sie sollten eine IDE wie Eclipse verwenden, in der Sie einfach mit der rechten Maustaste auf das Makro klicken und auf Deklaration öffnen klicken können, und Sie werden an die Datei weitergeleitet, und die Zeile, in der das Makro definiert ist.
Manchmal sind einige Makros nicht einmal in den Header-Dateien definiert, da sie als Flags an den GNU-Compiler übergeben werden (Beispiel: -DMYMACRO).
13814700cookie-checkSo finden Sie die Quelle einiger Makrosyes
Jede anständige IDE sollte Ihnen bei der Suche helfen irgendein Symbolname nicht nur ein Makroname. Source Insight ist ein solches Codeanalysetool.
– Alok Speichern
29. Juni 2012 um 7:06 Uhr
@Als: irgendein ist etwas stark. Symbole, die in einem Makefile erstellt und als Befehlszeilenargumente übergeben werden, können sehr schwer zu finden sein. Symbole, die in einem Programm generiert werden, das den Compiler über aufruft
exec
möglicherweise nur über RTFM zu finden.– David Hamm
29. Juni 2012 um 8:40 Uhr
@DavidHammen; Wir sprechen offensichtlich von Symbolnamen, die eine IDE oder ein Tool sind kann sehen.Ich denke, dass es eine Selbstverständlichkeit ist.
– Alok Speichern
29. Juni 2012 um 8:58 Uhr
Source Insight ist ein solches Code-Analyse-Tool ——– hallo, Als, Source Insight kann diese Makros nur innerhalb des Projekts finden, es kann keine Makros finden, die durch os- und c-Standard-Header und andere definiert sind. Wenn ich falsch liege Können Sie mir an dieser Stelle sagen, wie man es benutzt? tks
– Basketballneuling
29. Juni 2012 um 23:49 Uhr