Nur weil die Entwicklungszielsprache C ++ ist, gibt es keinen Grund, keine andere Sprache zu verwenden. Um den Zustand des Quellcodes zu überprüfen, den Sie in C ++ schreiben, können Sie ihn mithilfe einer Skriptsprache überprüfen.
Wenn Sie den vorhandenen Code durch Ausprobieren ändern, wird er möglicherweise zu einem seltsamen Code, bevor Sie ihn kennen. Möglicherweise befinden Sie sich in einer seltsamen Situation, wenn Sie ein anderes Programm ausschneiden und in einen Satz einfügen, um dessen Funktionalität zu verbessern.
Wenn Sie den Code, den Sie in "Move it first" geschrieben haben, nicht vollständig überprüfen, erhalten Sie einen so seltsamen Code. Wenn die Anzahl der Codezeilen gering ist grep '#define' *.h *.cpp Es wird irgendwie sein, aber In einer Situation, in der die Gesamtzahl der Zeilen in einem Programm zunimmt und leider viele Makros enthält, möchten Sie ein Tool, das besser als grep ist.
Makro ist #define DATA_SIZE (1000) #define square(x) ((x) * (x))
Es wird als durch Leerzeichen und Tabulatoren getrennt beschrieben, wie z Es gibt eine Regel, dass das erste Feld "#define" ist. Aus diesem Grund kann das oben genannte Tool zur Integritätsprüfung erstellt werden, indem die folgenden Tools erstellt werden.
-Split in Felder als durch Leerzeichen / Tabulatoren getrennten Text in Zeilen, die #define enthalten. -Wenn das erste Feld mit "#define" übereinstimmt, erstellen Sie ein Wörterbuch mit dem nächsten Feld als Schlüsselwort. Der Wert des Wörterbuchs ist eine Liste der Dateinamen des Quellcodes des Auftrittsorts.
Ein solches Tool kann leicht in einer Skriptsprache geschrieben werden. Lassen Sie uns ein komfortables C ++ - Leben mit der Skriptsprache führen.
Ich habe ein Referenzskript geschrieben.
doubledMacro.py
# -*- coding: utf-8 -*-
#pylint: disable=C0103
import os
u"""
Ein Skript, das doppelte Makros in der Header-Datei findet
"""
def findDoubledMacro(wdir):
d = {}
for root, dirs, files in os.walk(wdir):
files = [p for p in files if os.path.splitext(p)[1] in ('.h', '.hpp')]
for p in files:
fullname = os.path.join(root, p)
for line in open(fullname, "rt"):
oline=line.replace("(", " ")
oline=oline.replace(")", " ")
oline=oline.replace(",", " ")
f = oline.strip().split()
if len(f) >= 2 and f[0] == "#define":
if not d.has_key(f[1]):
d[f[1]] = []
d[f[1]].append(p)
for k in d.keys():
if len(d[k]) > 1:
print k, d[k]
if __name__ == "__main__":
wdir = "."
findDoubledMacro(wdir)
Beispiel für das Ausführungsergebnis
python
max ['sourceA.h', 'sourceB.h']
_UNICODE ['sourceB.h', 'sourceC.h']
DATA_SIZE ['sourceA.h', 'sourceB.h']
Eingabedaten für Ausführungsergebnisse
sourceA.h
#ifndef SOURCEB_H
#define SOURCEB_H
#define DATA_SIZE (100)
#define _UNICODE
#define DEBUG_VIEW
#define max(x,y) ((x) > (y) ? (x) : (y))
#endif
sourceB.h
#ifndef SOURCEB_H
#define SOURCEB_H
#define DATA_SIZE (100)
#define _UNICODE
#define DEBUG_VIEW
#define max(x,y) ((x) > (y) ? (x) : (y))
#endif
subDir/sourceC.h
#ifndef SOURCEC_H
#define SOURCEC_H
#define DATA_SIZEC (100)
#define _UNICODE
#define DEBUG_VIEW2
#endif
Nachtrag:
[Verwenden wir eine Skriptsprache für ein komfortables C ++ - Leben. 2 Generieren Sie automatisch eine C ++ - Quelle.] (http://qiita.com/nonbiri15/items/3e5361613390a8ff516e)
Recommended Posts