2011-02-27 3 views
7

Je cible Windows mais je ne vois pas pourquoi un code API que j'écris ne peut pas utiliser les types C++ de base. Ce que je veux faire, c'est exposer des méthodes qui retournent des chaînes et des ints. Dans le monde C# j'utiliserais juste une chaîne, et aurais une chaîne unicode, mais dans VC++ j'ai l'option d'utiliser std :: string, std :: wstring, ou MFC/ATL CStrings. Dois-je simplement utiliser std :: wstring exclusivement pour prendre en charge unicode, ou puis-je utiliser std :: string qui serait compilé en unicode en fonction de mes paramètres de construction? Je penche vers ce dernier. Je préférerais fournir des méthodes Get [Item] AsCString() sur mes objets pour d'autres types de chaînes.Types de base à exposer sur une API C++

De même devrais-je utiliser taille_t au lieu d'entier?

L'API va être utilisé par moi, et peut-être travailler un futur développeur sur l'interface graphique C++. C'est un moyen de séparer les préoccupations. Mes préférences:

  • Intuitivité pour les autres développeurs.
  • compatibilité avant avec VC
  • Compatibilité avec d'autres compilateurs C++
  • Performance (ce qui est une moindre préoccupation pour moi, mais il faut le temps de démarrage pour le repos de mon application)

Tous les guides seraient appréciés .

+1

Ce style de configuration de projet dépend vraiment de l'objectif du projet, etc. Tout a sa place, c'est pourquoi certains aspects ne sont pas simplement déconseillés. 'std :: string' est l'utilisation la plus courante que j'ai vue (bien que j'ai vu' wchar_t', etc. pour unicode) et si vous mesurez la taille de quelque chose, utilisez 'size_t'. – RageD

Répondre

1

Dans votre situation, il me faudrait quelques heures/jours pour développer une opinion et décider. Tout d'abord, je préfère beaucoup C_API à C++ _ API, même pour du code C++. Alors la réponse serait char *, ou wchar *, ou TCHAR *. Maintenant, essayez de deviner si vous attendez vraiment le besoin d'UNICODE. La grande majorité de mes projets (y compris ceux avec GUI), n'avait pas besoin d'UNICODE, la simplicité et la familiarité des tableaux C simples sont souvent difficiles à battre. En bref, essayez de prédire quels seront vos besoins, n'essayez pas de regarder trop loin dans le futur (2 ans est une bonne note), puis trouvez la solution la plus simple pour répondre aux besoins.

Dernière: Pour répondre à votre question plus directement, je commencerais avec std :: string comme mon 1er choix pour évaluer. À moins que je trouve un avantage d'offre en faveur des autres choix, je resterais avec lui.

1

En utilisant std :: wstring/string au lieu du MFC CString vous permettra de votre code vers d'autres cadres (par exemple Qt pour Windows).

Même lorsque vous utilisez std :: string, vous pouvez encoder les chaînes en UTF-8, de sorte que votre API sera toujours en mesure de retourner des chaînes UNICODE. Gardez à l'esprit que même wstring est vraiment UTF-16 et pas le complet 32 ​​bits UNICODE (alors que sur certains systèmes d'exploitation wstring est UTF-32).

2

Vous devriez probablement respecter le type de chaîne STL. La classe CString MFC est construite de toute façon de nos jours.

Comme nous l'avons déjà noté, l'utilisation de wstring n'est pas une solution miracle pour résoudre les problèmes liés à Unicode car de nombreux caractères Unicode nécessitent encore plusieurs wchars pour le codage.

L'utilisation utf-8 à la place présente des avantages potentiels (vous n'avez pas à vous soucier de boutisme par exemple).

Sous Windows, tous les noyaux modernes sont basées wchar, donc il y a un (minimum) frais généraux de performance impliqués si vous utilisez les versions 8bit char d'API.

Questions connexes