2011-02-27 9 views
7

Me estoy orientando a Windows, pero no veo ninguna razón por la cual algunos códigos API que estoy escribiendo no pueden usar tipos básicos de C++. Lo que quiero hacer es exponer los métodos que devuelven cadenas y puntos. En el mundo de C# solo usaría una cadena y una cadena Unicode, pero en VC++ tengo la opción de usar std :: string, std :: wstring o MFC/ATL CStrings.Tipos básicos para exponer en una API de C++

¿Debo usar std :: wstring exclusivamente para soportar unicode, o puedo usar std :: string que se compilará en unicode en función de la configuración de mi compilación? Me estoy inclinando hacia este último. Preferiría proporcionar métodos Get [Item] AsCString() en mis objetos para otros tipos de cadena.

También debería estar usando size_t en lugar de enteros?

La API la utilizaré yo, y quizás un futuro desarrollador que trabaje en la GUI de C++. Es una forma de separar preocupaciones. Mis preferencias:

  • Intuitividad para otros desarrolladores.
  • Compatibilidad hacia adelante con VC++
  • Compatibilidad con otros compiladores de C++
  • Rendimiento (esto es una preocupación menor para mí, pero necesita más tiempo para iniciar resto de mi aplicación)

sería apreciada Cualquier guías .

+1

Este estilo de configuración del proyecto realmente depende del propósito del proyecto, etc. Todo tiene su lugar y es por eso que ciertos aspectos no son simplemente obsoletos. 'std :: string' es el uso más común que he visto (aunque he visto' wchar_t', etc. para unicode) y si estás midiendo el tamaño de algo, usa 'size_t'. – RageD

Respuesta

1

En su situación me tomaría pocas horas/días para desarrollar una opinión y decidir. Antes que nada, prefiero mucho C_API a C++ _ API, incluso para código C++. Entonces la respuesta sería char *, o wchar *, o TCHAR *. Ahora, trate de adivinar si REALMENTE espera la necesidad de UNICODE. La gran mayoría de mis proyectos (incluidos aquellos con GUI) no necesitaban UNICODE; la simplicidad y la familiaridad de los C-arrays simples a menudo es difícil de superar.

En resumen, trate de predecir cuáles serán sus necesidades, no trate de mirar demasiado lejos en el futuro (2 años es una buena marca), luego proponga la solución más simple para satisfacer las necesidades.

Última: Para responder a su pregunta más directamente, comenzaría con std :: string como mi primera opción para evaluar. A menos que encuentre alguna ventaja en la oferta a favor de las otras opciones, me quedaré con eso.

1

El uso de std :: wstring/string en lugar de MFC CString le permitirá transferir su código a otros marcos (por ejemplo, Qt para Windows).

Incluso al usar std :: string, puede codificar las cadenas en UTF-8, por lo que su API todavía podrá devolver cadenas UNICODE. Tenga en cuenta que incluso wstring es realmente UTF-16 y no los 32 bits UNICODE completos (mientras que en algunos sistemas operativos wstring es UTF-32).

2

Probablemente debería apegarse al tipo de cadena STL. La clase MFC CString se construye sobre eso hoy en día de todos modos.

Como se ha señalado anteriormente, el uso de wstring no es una solución mágica para abordar los problemas de Unicode, ya que hay muchos caracteres Unicode que aún requieren múltiples wchars para codificar.

El uso de Utf-8 en su lugar tiene beneficios potenciales (no tiene que preocuparse por la permanencia, por ejemplo).

En Windows, todos los núcleos modernos están basados ​​en wchar, por lo que hay una sobrecarga de rendimiento (mínima) involucrada si utiliza las versiones de API de 8 bits.

Cuestiones relacionadas