Es gibt einige sehr erfahrene Leute bei Stack Overflow, die immer über den C-Standard sprechen. Die Leute scheinen nicht tragbare Lösungen nicht zu mögen, auch wenn sie für mich arbeiten. Ok, ich verstehe, dass der Standard befolgt werden muss, aber schränkt er nicht die Kreativität des Programmierers ein?
Welche konkreten Vorteile ergeben sich aus der Einhaltung einer Norm? Zumal Compiler den Standard möglicherweise etwas anders implementieren.
programming-languages
c
standards
0decimal0
quelle
quelle
Antworten:
Es gibt einige Gründe, warum das Festhalten am Standard eine gute Sache ist.
In einen Compiler gesperrt zu sein, ist zum Kotzen. Sie sind einer Gruppe von Entwicklern mit eigener Agenda völlig ausgeliefert. Sie sind offensichtlich nicht auf der Suche nach Ihnen oder etwas anderem, aber wenn Ihr Compiler anfängt, Optimierungen, neue Funktionen, Sicherheitsverbesserungen usw. in den Hintergrund zu rücken, ist dies zu schade. Du steckst fest. In extremen Fällen müssen einige Unternehmen mit dem Patchen des Tools beginnen, von dem sie sich abhängig gemacht haben. Dies ist eine enorme Geld- und Zeitverschwendung, wenn es andere Arbeitsinstrumente gibt.
Auf einer Plattform eingesperrt zu sein, ist schwerer. Wenn Sie Software auf Linux pushen und auf Windows umsteigen möchten, weil Sie erkennen, dass Ihr Markt wirklich da ist, müssen Sie verdammt schnell jeden nicht portablen Hack ändern, den Sie in Ihrem Code haben, um gut zu spielen mit GCC und MSVC. Wenn Sie mehrere Teile Ihres Kerndesigns haben, die auf so etwas basieren, viel Glück!
Rückwärts inkompatible Änderungen sind am härtesten. Der Standard wird niemals Ihren Code brechen (Python ignorieren). Einige zufällige Compiler-Autoren könnten jedoch entscheiden, dass dieses implementierungsspezifische Add-On den Aufwand nicht wert ist, und es fallen lassen. Wenn Sie sich zufällig darauf verlassen, bleiben Sie bei der alten veralteten Version hängen, in der sie zuletzt verwendet wurde.
Die übergeordnete Botschaft, sich an den Standard zu halten, macht Sie flexibler . Sie haben sicher eine eingeschränkte Sprache, aber Sie haben mehr
Es ist ein heikles Gleichgewicht, aber das völlige Ignorieren des Standards ist definitiv ein Fehler. Ich neige dazu, meinen C-Code so zu organisieren, dass er sich auf Abstraktionen stützt, die möglicherweise nicht portierbar sind, aber transparent portiert werden können, ohne alles zu ändern, was von der Abstraktion abhängt.
quelle
Der Standard ist eine Art "Vertrag" zwischen Ihnen und Ihrem Compiler, der die Bedeutung Ihrer Programme definiert. Als Programmierer haben wir oft ein bestimmtes mentales Modell, wie die Sprache funktioniert, und dieses mentale Modell steht oft im Widerspruch zum Standard. (C-Programmierer stellen sich einen Zeiger beispielsweise häufig grob als "eine Ganzzahl, die eine Speicheradresse angibt" vor und gehen daher davon aus, dass es sicher ist, Arithmetik / Konvertierungen / Manipulationen an Zeigern durchzuführen, die mit einer Ganzzahl ausgeführt werden, die einen Speicher angibt Diese Annahme stimmt nicht mit dem Standard überein, sondern schränkt die Möglichkeiten mit Zeigern sehr stark ein.)
Was ist also der Vorteil, dem Standard zu folgen, anstatt Ihrem eigenen mentalen Modell zu folgen?
Einfach ausgedrückt, der Standard ist korrekt und Ihr eigenes mentales Modell ist falsch. Ihr mentales Modell ist in der Regel eine vereinfachte Ansicht der Funktionsweise auf Ihrem eigenen System, wobei in den meisten Fällen alle Compiler-Optimierungen deaktiviert sind. Compiler-Hersteller bemühen sich im Allgemeinen nicht, sich daran anzupassen, insbesondere wenn es um Optimierungen geht. (Wenn Sie Ihr Vertragsende nicht aufhalten, können Sie vom Compiler kein bestimmtes Verhalten erwarten: Garbage-In, Garbage-Out.)
Es könnte besser sein zu sagen, "auch wenn sie für mich zu arbeiten scheinen ". Wenn Ihr Compiler nicht ausdrücklich dokumentiert, dass ein bestimmtes Verhalten funktioniert (dh, wenn Sie keinen angereicherten Standard verwenden, der aus der richtigen Standard- und Compiler-Dokumentation besteht), wissen Sie nicht, dass es wirklich funktioniert oder dass es wirklich zuverlässig ist. Beispielsweise führt der Überlauf von Ganzzahlen mit Vorzeichen in der Regel auf vielen Systemen zu einem Zeilenumbruch (
INT_MAX+1
was normalerweise der Fall istINT_MIN
) - außer dass Compiler "wissen", dass Arithmetik mit Ganzzahlen mit Vorzeichen in einem (korrekten) C-Programm niemals überläuft, und auf dieser Grundlage häufig sehr überraschende Optimierungen durchführen. " Wissen".quelle
-fwrapv
einer etwas anderen, nicht standardmäßigen Sprache kompilieren und dann verwenden, bei der die vorzeichenbehaftete Ganzzahl-Arithmetik immer umbrochen wird.Nein. Der Standard gibt an, was zu tun ist. Wenn es nicht spezifiziert ist, befinden Sie sich in einem undefinierten Verhaltensgebiet und dann sind alle Wetten aus - das Programm kann alles tun.
Da Sie ein konkretes Beispiel für
void main()
vs erwähnt habenint main()
, kann ich meine Antwort verbessern.void main()
ist keine Standarddeklaration der Hauptfunktion. Es kann auf einigen Compilern über Erweiterungen funktionieren, hängt jedoch von der Implementierung ab. Auch wenn es funktioniert, müssen Sie überprüfen, ob es das tut, was Sie wollen. Das Problem ist, dass Compiler-Entwickler möglicherweise entscheiden, esvoid main()
mit der nächsten Compiler-Version zu entfernen , wodurch Ihre Anwendung beschädigt wird.Andererseits definiert der Standard die Signatur von main as klar
int main()
und gibt an, was zu tun ist.Andererseits gibt es Dinge, die in der Norm nicht definiert sind. Dann kann ein anderer Standard gelten (wie zum Beispiel POSIX). Das beste Beispiel könnte die Implementierung von Threads in c ++ 03 sein, da c ++ 03-Standardprogramme 1-Thread-Programme waren. In diesem Fall müssen Sie eine plattformabhängige Bibliothek oder eine Art Boost verwenden .
quelle
Befolgen Sie keine Regeln, wenn es sich bei Ihrem Projekt um spezielle Projekte handelt, zum Beispiel um ein Regierungsprojekt oder ein Armeeprojekt. Sie müssen jedoch Regeln befolgen, wenn es sich um ein Open Source- oder großes Projekt mit einem verteilten Team handelt.
quelle