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?
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:
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 ...
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.
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.
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.
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.
Tags und Links c++ cross-platform