en C ++, si j'écris un jeu simple comme Pong à l'aide de Linux, peut-il être compilé sur Windows et OSX? Où puis-je dire qu'il ne pourrai pas être compilé? P>
5 Réponses :
Vous pouvez lire la norme - si un programme respecte la norme, il doit être compilable sur toutes les plates-formes disposant d'un compilateur compilant standard C ++. p>
Quant aux bibliothèques tierces que vous pouvez utiliser, la disponibilité de la plate-forme est généralement spécifiée dans la documentation. P>
Lorsque l'interface graphique vient à la question, il existe des options multiples-plates (telles que QT), mais vous devriez probablement vous demander - est-ce que je veux vraiment une portabilité quand elle vient à l'interface utilisateur? Parfois, il vaut mieux avoir la plate-forme de la plate-forme de l'interface graphique. P>
Bien sûr, il n'y a pas de compilateurs compatibles standard [il y en a eu un, mais la norme modifiée], plus la multitude de comportements définis par la mise en œuvre, de sorte que «respecter la norme» n'est donc que la première étape.
C ++ est Ultra Portable et compose des compilateurs disponibles sur plusieurs plates-formes que vous ne pouvez ébranler un bâton. Les langues comme Java sont typiquement présentées comme étant une plate-forme multiples massivement, elles sont en fait généralement implémentées en C ++, ou C. P>
qui couvre la "portabilité". Si vous voulez réellement dire, comment la plate-forme cross est C ++, alors pas tellement: la norme C ++ définit uniquement une bibliothèque IO adaptée à la console IO - c'est-à-dire du texte basé sur la console IO - dès que vous voulez développer une sorte d'interface graphique, vous aurez besoin de Pour utiliser un cadre d'interface graphique - et des cadres d'interface graphique sont historiquement très spécifiques à la plate-forme. Windows a plusieurs cadres interfaces graphiques "natifs" désormais - le cadre C ++ mis à disposition à partir de Microsoft est toujours MFC - qui enveloppe l'API Win32 natif qui est une API C. (WPF et Winforms sont disponibles pour CLR C ++). P>
Le cadre de l'interface graphique de l'Apple Mac est appelé cacao et est une bibliothèque de l'objectif-C, mais il est facile d'accéder à l'objectif C de C ++ dans cet environnement de développement. P>
On Linux Il y a les frameworks GTK + et QT qui sont réellement portés à Windows et Apple, de sorte que l'un de ces cadres C ++ peut résoudre votre "Comment écrire une application d'interface graphique en C ++ une fois qui se produit et fonctionne sous Windows, Apple Mac et Linux ". P>
Bien sûr, il est difficile de considérer qt comme strictement de C ++ plus tôt - qt définit un balisage spécial pour les signaux et les machines à sous nécessitant une étape de compilation de la compilation. P>
Même le texte E / S est difficile à faire de manière portant si vous avez besoin de caractères non ASCII.
La fouille de Java car elle est implémentée en C ++ est un hareng rouge. Perl, Python et Ruby sont écrits en C, mais ils sont beaucoup plus portables et C reste un cauchemar pour coder la plate-forme croisée.
Il y a aussi un compilateur pour les bâtons, bien que la secousse ne soit pas atomique et que vous devez regarder une utilisation en mémoire.
Si vous envisagez de porter de Linux à Windows, en utilisant OpenGL code> pour la partie graphique vous donne la liberté d'exécuter votre programme sur les deux systèmes d'exploitation tant que vous n'utilisez aucune fonctionnalité spécifique au système. . p>
Vous avez trois principaux obstacles de portabilité. P>
Le premier, et le plus simple, écrit C ++ code que tous les compilateurs cibles comprennent. Remarque: Ceci est différent de l'écriture à la norme C ++. Le problème de "écrire à la norme" commence par: quelle standard? Vous avez C ++ 98, C ++ 03, C ++ TR1 ou C ++ 11 ou C ++ 14 ou C ++ 17 ? Ce sont toutes des révisions de C ++ et le plus récent que vous utilisez les compilateurs moins conformes sont susceptibles d'être. C ++ est très grand et de manière réaliste la meilleure que vous puissiez espérer est C ++ 98 avec certaines caractéristiques C ++ 03. P>
compilateurs ajoutez toutes leurs propres extensions, et c'est trop facile pour les utiliser inconsciemment. Vous seriez sage d'écrire sur la norme et non à la documentation du compilateur. Certains compilateurs ont un mode "strict" où ils désactiveront toutes les extensions. Vous seriez sage de faire le développement primaire dans le compilateur qui a le plus de strictures et la meilleure conformité standard. Avec cela à l'esprit, rester sain d'esprit, vous devez vous limiter à une poignée de compilateurs et que seules leurs versions récentes. Même écrire une bibliothèque C relativement simple pour plusieurs compilateurs est difficile. Heureusement, Linux et OS X utilisent GCC. Windows a Visual C ++, mais différentes versions ressemblent davantage à une famille Squabillage qu'un seul compilateur lorsqu'il s'agit de compatibilité (avec la norme ou l'autre), vous devrez donc choisir une version ou deux pour soutenir. Vous pouvez également utiliser l'un des environnements de compilateur dérivés de GCC tels que Mingw . Cochez la case [Liste des compilateurs C ++] ( Les compilateurs moins conformes sont susceptibles de Soyez ) pour des informations de compatibilité, mais gardez à l'esprit que cela ne concerne que la dernière version. P>
Suivant est votre bibliothèque graphique et de son. Il ne doit pas simplement être une plate-forme croisée, elle doit être bonne et être rapide sur toutes les plateformes. Ces jours-ci, il y a beaucoup de possibilités, Simple DirectMedia Layer est un. Vous devrez choisir à quel niveau vous souhaitez coder. Voulez-vous un contrôle détaillé? Ou voulez-vous qu'un moteur s'occupe des choses? Il y a une réponse existante pour ce , donc je ne vais pas entrer dans les détails . Assurez-vous de choisir un qui est dédié à la plate-forme transversale, pas seulement au travail. Les bogues de compatibilité dans votre bibliothèque graphique peuvent enfoncer votre projet rapidement. P>
Enfin, il existe des incompatibilités simples qui existent entre les systèmes d'exploitation. La conformité POSIX a parcouru un long chemin et vous avez de la chance que Linux et OS X soient unix sous le capot, mais Windows sera toujours l'homme étrange. Les choses qui sont susceptibles de vous mordre surtout faire avec le système de fichiers. Voici une poignée: p>
GCC CODE> A la famille CODE> -WSTRICT CODE> La famille des drapeaux pour activer des avertissements stricts.
-ansi code> supprimera les extensions qui conflit avec la norme.
-std = c ++ 98 code> indiquera au compilateur de fonctionner contre la norme C ++ 98 et supprimer des extensions GNU C ++. P>
La bonne chose à propos des normes est que vous avez tant à choisir. code> ;-)
Par rapport à la portabilité C, C ++ est extrêmement limitée, sinon instantanément. Pour un, vous ne pouvez pas désactiver les exceptions (bien, vous pouvez), car la norme indique spécifiquement que le comportement indéfini. De nombreux appareils ne soutiennent même pas d'exceptions. Donc, comme pour cela, C ++ est zéro portable. En plus de voir l'UB, c'est Evemioulsy une no-go pour des systèmes en temps réel hautes performances de zéro-échouement dans lesquels des exceptions sont des comportements tabous - non définis n'a pas de place dans l'environnement zéro-échouement. Ensuite, il y a le nom de mangling que le plus, sinon tous, le compilateur est complètement différent. Pour une bonne portabilité et une compatibilité inter-compatibilité externe "C", il faudrait être utilisé pour exporter des symboles, mais cela rend toutes les informations d'espace de noms entièrement annulées, ce qui entraîne des symboles en double. On peut bien choisir d'utiliser des espaces de noms et d'utiliser des noms de symboles uniques. Encore une autre caractéristique C ++ rendu annulée. Ensuite, il y a la complexité de la langue, ce qui entraîne des difficultés de mise en œuvre dans les différents compilateurs pour diverses architectures. En raison de ces difficultés, la vraie portabilité devient un problème. On peut résoudre celui-ci en ayant une grande chaîne de directives de compilateur / # IFDEFS / Macros. Modèles? Pas même soutenu par la plupart des compilateurs. p>
Quelle portabilité? Vous voulez dire la semi-portabilité entre un couple de cibles de construction principale comme MSVC pour Windows et GCC pour Linux? Même là, dans ce segment principal des flux, tous les problèmes et limitations ci-dessus existent. Il est retardé de penser que c ++ est portable. p>
La plupart des points que vous avez présentés ne sont pas liés à la question posée: "Puis-je compiler un code C ++ compatible sur une plate-forme différente?" I> et la réponse à cette question souffre de Aucun b> de les problèmes que vous avez décrits. Vous ne pouvez pas (et ne pourrez pas) désactiver des exceptions, car il ne serait plus c ++. Nom Mangling n'est pas un problème non plus. C'est un contrat entre le compilateur et la liaison, et ils conviendront pour une chaîne d'outils donnée. Manque de soutien du modèle? UHM ... Ouais. C'était le dernier millénaire.
Cela dépend des bibliothèques / fonctions que vous utilisez exactement et si elles sont disponibles pour toutes les plateformes ...