Ich fing an, an mehreren C-Projekten zu arbeiten, die mit bauen gcc
. Ich glaube, diese Wahl wurde aus mehreren Gründen getroffen:
- Musste sehr früh für Arm Cross-Compilieren (glaube ich).
- Leistung ist die erste und wichtigste Spezifikation.
gcc
war und ist die einfache erste Wahl.
Ich habe keinen Grund, diese Wahl anzufechten, und ich bin sowieso nicht in der Lage, dies zu tun.
Die Codebasis eines einzelnen Projekts ist relativ klein. Jedes Projekt wird mit einem relativ sauberen Makefile erstellt (das derzeit aktualisiert wird), gcc -Wall -Wextra
beschwert sich bei weitem nicht und es werden nur minimale Tests durchgeführt. Es wird keine automatisierte statische Analyse oder Code-Formatierung durchgeführt, und der Code ist syntaktisch nicht konsistent, obwohl er sehr gut lesbar ist und sich durchdacht anfühlt.
Ich möchte nicht jede Codezeile auf einmal neu formatieren, ich beabsichtige, das zu tun, was irgendwo um diese Antwort herum beschrieben wurde (zumal der Kontext wirklich nicht so schlecht ist): Umgestaltung und hauptsächlich Neuformatierung so weit wie möglich, wenn es um ein Thema geht, Aber immer noch Themen ohne Absichten im Codestil. Leider bin ich nicht in der Lage, Commits einen Codestil oder zusätzliche Überprüfungen aufzuerlegen, aber ich bin der Meinung, dass meine Kollegen der Meinung sind, dass Sie beim Ändern einer Datei die vorhandene Codekonvention respektieren sollten (obwohl mir der aktuelle Status bekannt ist des Codes geschah nicht auf magische Weise) und der Wunsch, guten Code zu schreiben.
Dies ist das erste Mal, dass ich in C mit einem solchen Geisteszustand programmiere, und ich bin sehr angetan von den verschiedenen Tools zur Codeanalyse und -formatierung clang
.
Der Kern meiner Frage lautet also: Könnte es zu Problemen führen, wenn ich beim Erstellen von clang
Hinweisen Hinweise verwende und clang
Formatierungs- und Analysewerkzeuge verwende gcc
? Beispielsweise könnten einige Warnungen von einer internen Darstellung stammen, gcc
die nicht verwendet wird, oder von Bytecode clang
, der generiert gcc
werden soll, was nicht der Fall ist .
Gibt es eine gute Möglichkeit, die gcc
Kompilierungsparameter (hauptsächlich die Zielarchitektur und die Optimierungsstufe) automatisch zu übergeben , clang
damit die Warnhinweise sinnvoll sind?
Ich werde hinzufügen, dass ich mit gcc
und seiner Fehlerberichterstattung vertraut bin . Ich bin daran interessiert, mehr (relevante) Warnungen und Fehler zu erhalten, nicht nur besser formulierte und verständlichere Warnungen. Wenn ich also zusätzlichen Hinweisen nicht vertrauen clang
kann, die aufgrund ihrer internen Darstellung erstellt werden können, weil ich gcc
am Ende des Tages damit baue , dann bin ich nicht wirklich daran interessiert.
Ich habe viel Kontext aufgenommen, also zögern Sie nicht, eine Bemerkung zu machen oder eine zugrunde liegende Frage zu beantworten, die ich nicht herausbringen konnte.
quelle
Antworten:
Äußerst unwahrscheinlich. Clang warnt Sie vor Ihrem Code, nicht vor einer internen Darstellung, die er verwendet. Alle Warnungen sollten von etwas Verdächtigem stammen, das Sie in Ihrem Code tun, und nicht von Implementierungsdetails von clang.
Möglicherweise haben Sie Probleme, wenn einer der von Ihnen verwendeten Codes nicht standardmäßiges C ++ verwendet. GCC unterstützt viele Erweiterungen von C ++, die von anderen Compilern nicht akzeptiert werden. Wenn Sie eines dieser Elemente verwenden, kann clang die Kompilierung Ihres Codes einfach ablehnen. GCC muss das Kompilieren vieler alter Codes unterstützen und ist (wie ich es verstehe) in einigen Punkten milder als Clang.
quelle
Ich benutze beide bei der Arbeit, gcc und clang. Natürlich erhalten Sie mit beiden Compilern zusammen mehr Warnungen, und das ist großartig. Andererseits können sich die Warnungen widersprechen.
Der nervigste Fall, den ich gefunden habe, ist, wenn clang eine
default
Regel in erkenntswitch
und sagt, dass alle Werte bereits abgedeckt sind und gcc darauf besteht, einendefault
Fall zu haben ( hier dokumentiert ). Sie werden diesen Widerspruch jedoch nur sehen, wenn Sie auf beiden Compilern sehr strenge Warnungen einrichten.Subjektiv würde ich sagen, dass Clang strengere Warnungen hat und Sie sogar mehr davon erhalten können, wenn Sie
-Weverything
oder sogar den Clang-Analysator (statischer Code-Analysator) verwenden. Aber ich hatte auch Warnungen, die gcc entdeckt hat und die auch wichtig sind.Die meisten Compiler-Switches haben genau den gleichen Namen. Die Namen der Warnschalter unterscheiden sich. Dies kann ärgerlich sein, wenn Sie
-Wno-*
Optionen zum Deaktivieren von Warnungen verwenden. Soweit ich sehen kann, können Sie die bedingte Kompilierung in make / cmake nicht vermeiden, aber es ist nicht schwer, dies zu lösen.Ich würde es vermeiden, Code mit automatischen Werkzeugen zu formatieren. Es ist ärgerlich, weil es die Schuldausgabe verschmutzt. Und dann können langfristige Zusammenschlüsse sehr schwierig werden.
quelle