Comment écrire du code portable en c++?
Quelles sont les choses que je dois garder à l'esprit pour écrire du code portable? Depuis que je suis un c++ débutant, j'ai envie de le pratiquer depuis le début.
Grâce.
- Ce sent comme un Wiki de la Communauté concernée.
- Pourquoi, exactement? Si quelqu'un passer 30 minutes à l'écriture d'une bonne réponse à cette question, ne pas qu'ils méritent le représentant quand il est upvoted?
- Où voulez-vous les porter? il y a un monde de différences si vous envisagez l'adaptant aux différents systèmes d'exploitation, architectures différentes, donc il n'y est une réponse pour chaque port, par exemple, en 8 ou 16 bits minuscules systèmes embarqués, vous devez éviter l'utilisation de l'un quelconque des bibliothèques recommandé ici, donc, pourriez-vous être plus précis?
- Wiki de la communauté ne signifie pas que les contributeurs ne méritent pas de crédit. Cela signifie seulement qu'il n'y a pas une seule "bonne" réponse (comme ici, la question est subjective demande de conseils généraux). Chaque réponse contribue à une réponse collective à la question qui est à l'extérieur de la portée de toute contribution unique. Vous pouvez toujours upvote/downvote réponses à CW questions.
- Si vous faites une question wiki de la communauté, les contributeurs get pas de crédit. Vous n'obtenez pas de rep si votre CW réponse est upvoted. Donc, par définition, cela signifie que les "contributeurs ne méritent pas de crédit". Si les effets réels de la CW ne sont pas souhaitables, ne pas faire de la question de la CW.
- Cela ne veut pas dire qu'ils ne sont pas /mérite/ crédit, seulement qu'ils n'ont pas /obtenir/ de crédit. Mais cette discussion est horriblement hors-sujet de la question et a besoin de se déplacer à la méta.stackoverflow
- Donc, vous dites contributeurs du mérite, mais ne devrait pas le faire? Et pourquoi? Juste afin que nous puissions obtenir l'arbitraire d'un "Wiki de la Communauté" étiquette à côté de lui? Ce que n'importe qui en retirent? Pourquoi est-ce une bonne chose? Nous serions en donnant quelque chose de bon (récompenser les gens pour la rédaction des réponses), il devrait donc y avoir d'autres avantages pour compenser cela. Qu'est-ce que cela? Le uniquement l'avantage, c'est que la CW mafia obtient une chaude, douillette à l'intérieur. Et non, le débat s'inscrit partout les gens suggèrent effectivement CW avec une question.
Vous devez vous connecter pour publier un commentaire.
shared_ptr
, devrait être un standard de facto, sauf en interne des solutions de rechange sont déjà disponibles. De toute façon, pourquoi pensez-vous de son inappropriées pour les petits projets? Il suffit d'inclure ce que vous utiliser, il suffit d'emballer les parties pertinentes si vous avez besoin de distribuer de source.Garder la plate-forme de code spécifique, distincte de code réutilisable, de préférence dans un fichier différent, mais au moins dans une fonction différente. Si vous commencez à avoir
#if WIN32
et#if CYGWIN
et#if BSD
tous sur la place, vous aurez un entretien cauchemar.Compilez ensuite sur au moins deux plateformes différentes tôt et souvent. Les choix typiques sont Visual C++ sous Windows et gcc sous Linux. Étant donné que ni le système de bibliothèques, ni le compilateur est partagé, tu vas attraper du code non portable avant qu'il ne devienne profondément ancrée dans votre conception.
Écrire des programmes de ligne de commande pour commencer. Lorsque vous êtes prêt, trouver une croix-plate-forme windowing toolkit comme Qt.
Si vous êtes intéressé par l'écriture multilingue code, utiliser un tiers unicode bibliothèque comme ICU plutôt que de s'appuyer sur une plate-forme spécifique des bibliothèques.
std::string
travaille souvent, sur Windowsstd::wstring
fonctionne toujours, mais pour vraiment OS-programmes indépendants, vous avez besoin d'un véritable type de données chaîne comme intensifsUnicodeString
.STL types lorsque cela est possible. Soyez prudent d'utiliser le système de types dépendants et les Api. Par exemple, n'utilisez pas les types comme UINT, et DWORD sur Windows.
Vous pouvez utiliser une bibliothèque comme boost pour le rendre plus facile pour vous d'écrire du code portable. Si vous avez besoin d'une interface graphique d'envisager l'utilisation d'une plate-forme de trousse d'outils comme Qt.
Parfois, vous aurez besoin d'écrire de la plate-forme de code, et dans ce cas, vous pouvez faire quelque chose comme ceci:
Les imprudents programmeur est susceptible de pied dans un tas de pièges, que l'on peut tenter de classer. Mais laissez-moi vous dire d'abord: comme un absolu, c'est impossible.
Le problème, c'est que même standard conforme code peut ne pas être portable à cause d'un compilateur question.
Maintenant, voici les principales catégories que je peux penser sur le dessus de ma tête.
Compilateur extensions
Comme par exemple l'utilisation de variables tableaux:
Ce n'est pas la norme, mais de nombreux compilateurs de soutien, elle a quand même parce que c'est juste pratique.
Bibliothèques Standard extensions
De nombreuses bibliothèques standard implémentations de fournir un
std::hash_map
qui n'a jamais été spécifié. Si vous l'utilisez dans votre code, il n'est pas portable.La tendance moderne est de ranger ce genre de choses dans le
std::tr1
espace de noms, de sorte que les programmeurs sont conscients que c'est une extension.Également être conscients que de nombreux définir
typedef
ou les macros qui ne sont pas génériques (par exemplePRETTY_FUNCTION
). Pas de macro est spécifiée par la norme, et très peu de typedef sont.De la plate-forme
Par exemple, la taille et l'alignement de
int
oudouble
n'est pas spécifié dans la norme. Si vous ne peu-se tourner et s'attendre à avoir 32 bits, vous allez être vissé sur 64 bits pour les plates-formes sans même changer votre compilateur.Plate-forme API
Nos programmes sont destinés à être compilé, et ils sont souvent destinés à interagir avec l'ordinateur qu'ils utilisent:
Vous avez besoin de trouver de la croix-plate-forme portable Api, ou rouler vos propres. De vérifier certains des bibliothèques dans la liste ci-dessous.
Bibliothèques
Plus bien écrits, les bibliothèques sont en grande partie portable, assurez-vous juste qu'ils prennent en charge:
Bonnes bibliothèques impliquer:
Les autres, vous avez besoin de se revoir... et cela prend du temps.
Je ne pense pas qu'il y est une parfaite réponse. Mais depuis parfaite portabilité n'est pas possible, vous devez décider de compilateurs et de la plate-forme que vous souhaitez soutenir.
Pour la plate-forme, vous devriez commencer avec Windows et un Linux. Pour les compilateurs, ramassez tous les deux (avec Comeau si vous pouvez vous le permettre).
Quelques lignes directrices:
Parfois, vous avez à faire des compromis d'efficacité et de performance pour le gain de la portabilité. Par exemple, si votre code requiert d'accéder à des champs d'un tampon, vous pouvez toujours jeter un paniers struct le pointeur de la mémoire tampon. Mais c'est horriblement non-portable. Donc, vous devez plutôt utiliser nommé pointeurs calculé avec des décalages, parfois avec d'alignement des limites de la manipulation de code. Pas joli, mais portable. Heureusement, vous pouvez cacher un lot de ce genre de choses avec une utilisation judicieuse de la classe des interfaces.
Pas tout le code doit être écrit de cette façon. Si vous concevez votre application dans un modulaire avec des limites bien définies de responsabilité, de 90 à 95% du code peut être portable sans douleur. Puis il suffit d'isoler les 5 à 10% dans une zone très localisée, qui doivent être adaptés pour une nouvelle plate-forme.
D'autres ont dit qu'avant, mais voici mon point de vue sur elle:
1) avez-vous besoin de C++? Ce n'est pas le meilleur langage pour écrire du code portable, car il est à proximité du métal nu. Java, Python, Perl, PHP ou Javascript peut-être mieux pour vous.
2) Si vous avez besoin de C++, n'essayez pas de rédiger un code portable, il est presque impossible de toute façon. Au lieu de cela, décider dès le début quelles plates-formes que vous voulez soutenir. Par exemple: Linux, MacOS X, Windows
3) assurez-vous de tester votre code sur toutes les plates formes de façon continue. Ne vous contentez pas de build sur Windows et s'attendent à seulement compiler une version de Linux que lorsque c'est terminé". Compiler sur toutes les plates-formes quotidien et assurez-vous de garder des tests de dépistage de problèmes.
Pour l'apprentissage, essayez d'éviter de livres que de se concentrer sur une mise en œuvre. Dans certains cas, l'introduction ou un début de chapitre vous donnera quelques instructions sur la façon d'obtenir ou d'utiliser un langage de mise en œuvre; si elle mentionne plus d'une mise en œuvre, vous êtes probablement OK.
Obtenir un livre de référence qui est indépendant de la plateforme. De Stroustrup Le Langage de Programmation C++ est une belle référence, même si elle n'est pas un bon livre pour un débutant d'essayer d'apprendre de. Ne comptez pas sur les références pour une application donnée. MSDN est utile, par exemple, mais son principal objectif est de savoir comment écrire des programmes Windows à l'aide de Visual C++, pas comment écrire des programmes qui permettront de compiler et d'exécuter de n'importe où.
À écrire quelque chose de vraiment utile, vous allez avoir à obtenir en non-compatibles code. Essayez d'obtenir dans l'habitude de séparer le code de l'interface utilisateur de tout le reste, puisque c'est là que vous aurez le moins de compatibilité. Le moins de code, vous devez changer entre les plates-formes, le plus portable votre code.
Si vous le pouvez, de compiler tout votre code avec au moins deux différents compilateurs.
OS-code indépendant de la est étonnamment difficile de le faire en C++. Considérons cet exemple trivial:
Qui est parfaitement valide en C++, c'est toujours non-compatibles, car il n'accepte pas l'Unicode arguments de ligne de commande sur Windows. La bonne version pour Windows serait:
Bien sûr c'est encore non-compatibles, en travaillant uniquement sur Windows et être non standard. Donc, en fait, vous ne pouvez même pas écrire un portable
main()
fonction en C++ sans avoir recours à la compilation conditionnelle.std::endl
au lieu de cela, ce qui vide le tampon et produit en fait une partie de la sortie. Je ne peux pas commencer à compter à toutes les questions que j'ai vu sur d'ALORS, qui se résumait à des gens de ne pas le rinçagecout
.wchar_t
est toujours un entier non signé 16 bits sur Windows (sinon pas de programme serait de compiler), vous pouvez utiliserwchar_t
si vous voulez le support de l'Unicode sur Windows. @Ben: Merci, je vais corriger.une bonne idée est d'utiliser POSIX, les appels système. de cette façon, vous n'avez pas à traiter avec les différentes façons de créer des threads ou de l'utilisation de mutex et les signaux.
le problème est que Windows n'est pas exactement conforme à POSIX, mais il y a des bibliothèques qui mettent en œuvre certaines fonctionnalités POSIX, comme celui-ci: [1]: http://sourceware.org/pthreads-win32/