2016-07-13 5 views
1

Ist es möglich, einen C- oder C++ - Standard für nur einen Teil einer Quelldatei zu erzwingen? Ich möchte sicherstellen, dass meine Quelldatei C90-kompatibel ist, aber es hängt von einigen Headern ab, die C99 benötigen. Die Übereinstimmung dieser Header ist für mich momentan nicht wichtig (ich kann vorläufig mit C99 kompilieren), aber ich möchte den Aufwand minimieren, der erforderlich ist, um meinen Code in Zukunft auf eine restriktivere Plattform zu portieren.Wenden Sie den Sprachstandard nur auf einen Teil einer Quelldatei an?

Kurz gesagt, ich möchte einen Sprachstandard für die gesamte Datei mit Ausnahme der enthaltenen Header gelten. Angesichts der Tatsache, dass die Header-Inclusion in C und C++ funktioniert, stelle ich fest, dass das generelle Problem darin besteht, einen Sprachstandard auf einen beliebigen Teil einer gegebenen Quelldatei anzuwenden.

Ich arbeite gerade mit GCC, aber ich bin auch neugierig, ob dies mit anderen Compilern (msvc, clang) möglich ist.

+0

Aber Sie wissen, dass es einige Dinge gibt, die für ganze Dateien relevant sind, "Interaktionen" zwischen Quelldateien und ganzen Programmen im Standard? Teile der Quellcodedateien existieren nicht in ihrem eigenen Vakuum. – deviantfan

+0

Was ist der Sinn? –

+0

@EugeneSh. - Die Idee ist, den Compiler zu verwenden, um die Einhaltung von Standards zu erzwingen. Selbst wenn es nicht machbar ist, alle Abhängigkeiten der Datei so zu überarbeiten, dass sie jetzt C90 entsprechen, wäre es nützlich, in der Lage zu sein zu behaupten, dass die Quelldatei in der Entwicklung keine vom alten Standard nicht unterstützten Sprachkonstrukte verwendet. –

Antwort

3

Wenn Sie sicherstellen möchten, dass Ihr Code C90-kompatibel ist und dennoch auf Header mit C99 angewiesen ist, können Sie das GCC-Warnflag -Wc90-c99-compat aktivieren. Auf diese Weise können Sie die C99-Funktionen verwenden, jedoch wird eine Warnung ausgegeben, wenn Sie Funktionen verwenden, die in C90 nicht verfügbar sind. Um zu vermeiden, dass diese Warnungen in Ihren Headerdateien generiert werden (die vermutlich korrekt sind), aktivieren Sie die Warnung mithilfe eines Pragmas, nachdem Sie die Dateien hinzugefügt haben.

Dies wird grundsätzlich erreichen, was Sie wollen. Die Warnungen werden nur für den von Ihnen angegebenen Code ausgegeben.

#include "myheader.h" 

#pragma GCC diagnostic warning "-Wc90-c99-compat" 

void func(void) { ... } 

Eine strengere Version zu verwenden wäre:

#pragma GCC diagnostic error "-Wc90-c99-compat" 

Soweit ich weiß, Clang meist kompatibel ist, aber MSVC nicht wirklich C99 unterstützen, die gut mit so zu beginnen, du bist allein.

+0

Markiert dies als akzeptiert, da es mein Problem direkt löst (zu warnen/Fehler bei Kompatibilitätsproblemen für beliebige Abschnitte des Codes). Entschuldigung an Jesper Juhl, dessen Antwort die direkt gestellte Frage technisch anspricht. –

+0

Ein zusätzlicher Hinweis: Ironischerweise löst das nur theoretisch mein Problem, da die hier aufgeführte Warnflagge nur für GCC 5 und darüber hinaus existiert - leider auf meiner Plattform nicht verfügbar. Dennoch könnte man die Warnung aktivieren und die Konformität durch Testen einer Kompilierung mit einem neueren GCC bestätigen. –

+0

@ JackO'Reilly: GCC 5 wird wahrscheinlich bald auf Ihrer Plattform ankommen. –

3

Nein. Sie können keine Datei (Kompilierungseinheit) als teilweise einen Sprachstandard und teilweise eine andere erstellen.

Was Sie können tun jedoch ist die Datei in zwei Dateien aufgeteilt und kompilieren jedes von ihnen mit anderen Sprachstandards (nur sicher sein, dass es dann immer noch gut definiert ist, beide Objektdateien anschließend zu verknüpfen).

Eine bessere Lösung wäre sicherzustellen, dass alle der Code entspricht dem neueren oder älteren Sprachstandard und dann einfach verwenden.

+0

Eine alternative Lösung wäre, sicherzustellen, dass der gesamte Code mit dem älteren Sprachstandard kompiliert wird, und diesen einfach verwenden. Das bedeutet, dass die Header konvertiert werden müssen, um C99-Features zu vermeiden. – Peter

+0

Danke für die Antwort. Ich habe darüber nachgedacht, die Datei in zwei Teile aufzuteilen, aber wird die Datei mit der strengeren Übereinstimmung nicht immer die gleichen Header enthalten müssen und das gleiche Problem haben? –

+0

@Peter Sicher, aber wenn Sie den Code bearbeiten müssen, um älteren oder neueren Standards zu entsprechen, scheint es kontraproduktiv zu sein, die älteren zu erreichen. –

Verwandte Themen