Wie portabel IST C ++?

8

Wenn ich in C ++ ein einfaches Spiel wie Pong unter Linux schreibe, kann der gleiche Code unter Windows und OSX kompiliert werden? Wo kann ich sagen, dass es nicht kompiliert werden kann?

    
Matt Bettinson 22.10.2011, 20:20
quelle

5 Antworten

12

Sie haben drei wichtige Portabilitätshürden.

Der erste und einfachste Code schreibt C ++ - Code, den alle Ziel-Compiler verstehen. Hinweis: Dies unterscheidet sich vom Schreiben in den C ++ - Standard. Das Problem mit dem "Schreiben zum Standard" beginnt mit: welchem ​​Standard? Sie haben C ++ 98, C ++ 03, C ++ TR1 oder C ++ 11 ? Dies sind alle Überarbeitungen von C ++ und die neuere Version, die Sie verwenden, die weniger kompatiblen Compiler sind wahrscheinlich. C ++ ist sehr groß und realistisch das Beste, auf das Sie hoffen können, ist C ++ 98 mit einigen C ++ 03 Eigenschaften.

Compiler fügen ihre eigenen Erweiterungen hinzu, und es ist allzu einfach, sie unwissentlich zu verwenden. Es wäre ratsam, in den Standard und nicht in die Compilerdokumentation zu schreiben. Einige Compiler haben einen "strikten" Modus, in dem sie alle Erweiterungen ausschalten. Es wäre klug, eine Primärentwicklung in dem Compiler zu machen, der die strengsten Regeln und die beste Standardkonformität aufweist. gcc hat die Flagfamilie -Wstrict , um strenge Warnungen zu aktivieren. -ansi entfernt Erweiterungen, die mit dem Standard in Konflikt stehen. -std=c++98 weist den Compiler an, gegen den C ++ 98 Standard zu arbeiten und GNU C ++ Erweiterungen zu entfernen.

Damit Sie vernünftig bleiben, müssen Sie sich auf eine Handvoll Compiler beschränken. Selbst das Schreiben einer relativ einfachen C-Bibliothek für mehrere Compiler ist schwierig. Glücklicherweise verwenden sowohl Linux als auch OS X gcc. Windows hat Visual C ++, aber verschiedene Versionen ähneln eher einer streitenden Familie als einem einzelnen Compiler, wenn es um Kompatibilität (mit dem Standard oder jedem anderen) geht. Sie müssen also eine oder zwei Versionen auswählen, die unterstützt werden. Alternativ können Sie eine der von gcc abgeleiteten Compiler-Umgebungen wie MinGW verwenden.

Weiter ist Ihre Grafik- und Sound-Bibliothek. Es muss nicht nur plattformübergreifend sein, es muss gut aussehen und auf allen Plattformen schnell sein. Heutzutage gibt es viele Möglichkeiten, Simple DirectMedia Layer ist einer davon. Sie müssen wählen, auf welcher Ebene Sie programmieren möchten. Willst du detaillierte Kontrolle? Oder willst du, dass ein Motor sich um Dinge kümmert? Dafür gibt es eine Antwort , daher werde ich nicht näher darauf eingehen . Achten Sie darauf, einen zu wählen, der plattformübergreifend arbeitet und nicht nur zufällig funktioniert. Kompatibilitätsfehler in Ihrer Grafikbibliothek können Ihr Projekt schnell versenken.

Schließlich gibt es die einfachen Inkompatibilitäten zwischen den Betriebssystemen. Die Einhaltung von POSIX hat einen langen Weg hinter sich, und Sie haben Glück, dass sowohl Linux als auch OS X Unix unter der Haube sind, aber Windows wird immer der eine oder andere sein. Dinge, die einen beißen können, haben meistens mit dem Dateisystem zu tun. Hier ist eine Handvoll:

  • Dateisystemlayout
  • Dateipfad-Syntax (z. B. C: \ foo \ bar vs / foo / bar)
  • Obligatorische Windows-Dateisperrung
  • Unterschiedliche Dateiberechtigungssysteme
  • Unterschiedliche Modelle der Interprozesskommunikation (z. B. fork, shared memory, etc ...)
  • Unterschiedliche Threading-Modelle (Ihre Grafikbibliothek sollte dies glätten)

Da hast du es. Was für ein Chaos, nicht wahr? Cross-Plattform-Programmierung ist ebenso ein Geisteszustand und eine Absichtserklärung wie eine Technik. Es erfordert etwas Hingabe und zusätzliche Zeit. Es gibt einige Dinge, die Sie tun können, um den Prozess weniger anstrengend zu machen ...

  • Aktivieren Sie alle Einschränkungen und Warnungen , und beheben Sie sie.
  • Deaktivieren Sie alle Spracherweiterungen
  • Kompilieren und testen Sie regelmäßig in Windows, nicht nur am Ende
  • Erhalte Programmierer, die Windows auf dem Projekt mögen
  • Beschränken Sie sich auf so wenige Compiler wie möglich
  • Wählen Sie eine gut gepflegte, gut unterstützte Grafikbibliothek
  • Plattformspezifischen Code isolieren (z. B. in einer Unterklasse)
  • Behandle Windows als erstklassiger Bürger

Das Wichtigste ist, das alles von Anfang an zu tun . Portabilität ist nicht etwas, das Sie am Ende anziehen. Nicht nur dein Code, sondern dein ganzes Design kann unportabel werden, wenn du nicht wachsam bist.

    
Schwern 22.10.2011 21:05
quelle
8

C ++ ist ultraportabel und bietet Compiler auf mehr Plattformen, als Sie mit einem Stick schütteln können. Sprachen wie Java werden normalerweise als plattformübergreifend bezeichnet, ironischerweise werden sie tatsächlich in C ++ oder C implementiert.

Das deckt "Portabilität" ab. Wenn Sie eigentlich meinen, wie plattformübergreifend C ++ ist, dann nicht so viel: Der C ++ - Standard definiert nur eine IO-Bibliothek, die für Konsolen-IO geeignet ist - also textbasiert, also sobald Sie eine Art von GUI entwickeln wollen ein GUI-Framework zu verwenden - und GUI-Frameworks sind historisch sehr plattformspezifisch. Windows hat jetzt mehrere "native" GUI-Frameworks - das C ++ - Framework, das von Microsoft zur Verfügung gestellt wird, ist immer noch MFC - das die native Win32-API umschließt, die eine C-API ist. (WPF und WinForms sind für CLR C ++ verfügbar).

Das GUI-Framework des Apple Mac heißt Cocoa und ist eine objective-C-Bibliothek, aber in dieser Entwicklungsumgebung ist es leicht, von C ++ aus auf C zuzugreifen.

Unter Linux gibt es die GTK + - und Qt-Frameworks, die beide tatsächlich nach Windows und Apple portiert sind. Eines dieser C ++ - Frameworks kann also Ihre "Wie schreibt man eine GUI-Anwendung in C ++? und Linux ".

Natürlich ist es schwierig, Qt als streng C ++ zu betrachten - Qt definiert ein spezielles Markup für Signale und Slots, das einen Kompilierschritt vor dem Kompilieren erfordert.

    
Chris Becke 22.10.2011 20:26
quelle
4

Sie können den Standard lesen - wenn ein Programm den Standard einhält, sollte es auf allen Plattformen kompilierbar sein, die einen C ++ - Standard-kompatiblen Compiler haben.

Wie bei anderen Bibliotheken von Drittanbietern wird die Plattformverfügbarkeit normalerweise in der Dokumentation angegeben.

Wenn GUI in Frage kommt, gibt es plattformübergreifende Optionen (wie QT), aber Sie sollten sich wahrscheinlich fragen - möchte ich wirklich Portabilität, wenn es um UI geht? Manchmal ist es besser, wenn die GUI plattformspezifisch ist.

    
Luchian Grigore 22.10.2011 20:25
quelle
1

Wenn Sie über die Portierung von Linux nach Windows nachdenken, können Sie mithilfe von OPENGL für den grafischen Teil Ihr Programm auf beiden Betriebssystemen ausführen, solange Sie keine systemspezifischen Funktionen verwenden.

    
ahj 22.10.2011 20:40
quelle
-3

Im Vergleich zu C ist die C ++ - Portabilität extrem begrenzt, wenn nicht gar nicht existent. Zum einen können Sie Ausnahmen nicht deaktivieren (na ja, Sie können), denn der Standard sagt ausdrücklich, dass das Verhalten nicht definiert ist. Viele Geräte unterstützen keine Ausnahmen. Daher ist C ++ NULL portabel. Wenn man die UB betrachtet, ist es offensichtlich ein Null-Fehler-Hochleistungs-Echtzeit-System, in dem Ausnahmen tabu sind - undefiniertes Verhalten hat keinen Platz in der Null-Fehler-Umgebung. Dann gibt es den Namen Mangling, den die meisten, wenn nicht alle Compiler völlig anders machen. Für eine gute Portabilität und Interkompatibilität müsste extern "C" zum Exportieren von Symbolen verwendet werden, doch dies macht jegliche Namespace-Information vollständig ungültig, was zu doppelten Symbolen führt. Man kann natürlich wählen, keine Namespaces zu verwenden und eindeutige Symbolnamen zu verwenden. Noch eine C ++ Funktion, die ungültig gemacht wurde. Hinzu kommt die Komplexität der Sprache, die zu Implementierungsschwierigkeiten in den verschiedenen Compilern für verschiedene Architekturen führt. Aufgrund dieser Schwierigkeiten wird echte Portabilität ein Problem. Man kann dies lösen, indem man eine große Kette von Compiler-Direktiven / # ifdefs / macros hat. Vorlagen? Nicht einmal von den meisten Compilern unterstützt.

Welche Portabilität? Sie meinen die Semi-Portabilität zwischen einigen Mainstream-Build-Zielen wie MSVC für Windows und GCC für Linux? Selbst dort, in diesem MAIN-STREAM-Segment, existieren alle obigen Probleme und Beschränkungen. Es ist zurückhaltend zu denken, dass C ++ portabel ist.

    
Coriiander Drewitt 18.02.2015 12:36
quelle

Tags und Links