2010-12-28 16 views
9

A menudo leo acerca de algunos programas que eliminan algunas características de C++ para cumplir con compiladores de C++ pobres/antiguos/exóticos.¿Qué características de C++ (98/03) no son tan bien compatibles con compiladores deficientes?

This one es sólo el último que se metió en: Box2D no está utilizando espacios de nombres, ya que necesitan para apoyar:

pobres compiladores de C++ donde el apoyo del espacio de nombres puede ser irregular

Un ejemplo más grande Puedo pensar que Qt, que confía en MOC, está limitando mucho el uso de plantillas y está evitando plantillas (bueno, esto es al menos cierto para Qt3 y versiones anteriores, Qt4 lo hace principalmente para cumplir sus convenciones).


Me pregunto qué compiladores son tan pobres?
Hay lots of C++ compilers por ahí (nunca he oído hablar de la mayoría de ellos), pero espero que todos ellos sean compatibles con las características más comunes (/ simples?) De C++ como espacios de nombres (a menos que estén muertos); ¿No es este el caso?

¿Cuáles son las características más incompatibles?
Puedo fácilmente esperar la falta de plantillas externas, tal vez especialización parcial de plantilla y características similares. A lo sumo, incluso RTTI o excepciones, pero nunca hubiera sospechado de espacios de nombres.

+2

Hmm. Box2D aparentemente "comenzó su vida" a principios de 2006. Eso suena en el lado tardío para evitar los espacios de nombres. Pero Qt3 data de una época en la que no existía un compilador decente de Windows C++, y su impulso lo ha llevado desde entonces. – aschepler

+2

Uno podría notar que el MOC de QT (Meta Object Compiler) realmente no tiene nada que ver con tener o no tener una característica de C++ o la otra. Siempre lo he visto como una función complementaria (útil) que hace que programar con Qt sea más simple que tratar de implementar su conjunto de características a través de C++ puro. –

+0

@Martin: por lo que sé con C++ 03 es relativamente sencillo implementar casi todo lo que se usa MOC, especialmente el mecanismo de señal/ranura (ver boost.signal) que creo que es la característica más importante para la cual MOC tiene sido creado. – peoro

Respuesta

8

En mi experiencia, la gente tiene miedo de las cosas nuevas y especialmente de las que una vez se derrumbaron, hace 20 décadas. No hay ninguna razón válida contra el uso de espacios de nombres en cualquier cosa escrita durante este siglo.

Si está buscando algo que descartar, si su objetivo era Windows no hace mucho tiempo, tenía que hacer algo más que simplemente sacar características de C++ y no usarlas, tenía que usar una sintaxis diferente . Las plantillas vienen a la mente como una de las funciones peor compatibles en VC. Han mejorado mucho pero a veces fallan.

Otro que no es compatible con ese compilador en particular (STILL!) Está sobrecargando las funciones virtuales para devolver punteros de tipo derivado a los tipos que devolvió la versión base cuando se usa MI. VC simplemente se asusto y termina teniendo que hacer virtual_xxx() y proporcionar funciones "xxx()" no virtuales para replicar el comportamiento estándar.

+0

Err ... El siglo es un poco fuerte teniendo en cuenta que el idioma en sí no tiene ni un siglo de antigüedad: P Pero +1. (¿Y 20 décadas? No conozco a nadie con más de 200 años ...) –

+3

@Billy: El lenguaje fue estandarizado en el siglo pasado, sin embargo. – sbi

+0

@sbi: Ah ... ya veo. De acuerdo. –

0

Qt no usa muchas plantillas porque es anterior a las plantillas.

+0

Esto es cierto, pero realmente no responde la pregunta. –

+0

Esto probablemente debería ser un comentario a la pregunta. – sbi

+4

Qt tiene más problemas que eso. Una clase Q_OBJECT tampoco puede ser una plantilla, el MOC vomitará. Uno de los mayores problemas con Qt, una gran biblioteca por lo demás, es el uso de "extensiones" que realmente rompen el lenguaje para convertir C++ en Python. –

2

Básicamente cualquier cosa que se haya agregado como parte del proceso de estandarización en C++ 98. Es decir:

  • plantillas (especialización no solo parcial - me refiero a todas las plantillas)
  • excepciones (a menudo porque éste requiere soporte de ejecución/cabeza - son a menudo no están disponibles en cosas como los microcontroladores)
  • Los espacios de nombres
  • RTTI

Si usted va aún más antigua, se puede añadir

  • Casi todo en la biblioteca estándar.

Varios compiladores antiguos son simplemente malos; OTOH: No recomendaría mucho preocuparme por ellos. Ya hay disponibles varios compiladores buenos y libremente disponibles que cumplen razonablemente con los estándares para casi todas las plataformas de las que tengo conocimiento (principalmente a través de G ++).

+2

Demonios, ¿en serio? ¿Qué compiladores actualmente no admiten espacios de nombres, plantillas y el pequeño RTTI C++? ¿Hay algo relevante en esa lista de compiladores? Lo dudo seriamente. – sbi

+0

@sbi: Asumí que el OP estaba hablando de compiladores más antiguos/oscuros, ya que la mayoría de los compiladores modernos soportan bastante bien todo en C++ 03. –

+2

El desarrollo de software moderno no debe atender a los compiladores antiguos. Ya no puedes llamarlos C++. Ahora que el lenguaje está estandarizado, todos son no conformes e implementan un lenguaje COMO C++ pero no C++. Los métodos de diseño modernos EXIGEN bastante un compilador conforme, por lo que al limitarse a apoyar a aquellos que no lo hacen, se ve seriamente impedido en el uso de muchas herramientas muy poderosas. –

4

¿Cuáles son las características más incompatibles?

Vamos a abstraer export, que, por desgracia, fue un experimento que falló. Luego, según el recuento de usuarios del compilador, probablemente sea búsqueda en dos fases, que Visual C++ aún no implementa correctamente. Y VC tiene mucho de usuarios.

+1

+1 para exportar: tiene que ser _la_ característica menos soportada de C++ 03. –

+0

@Charles: Sí, pero 'exportar 'es tan obvio, pensé que para cuando mi respuesta llegara a haber habrá alrededor de 10 respuestas gritando' exportar '. – sbi

+1

Tanto que ignoro por completo y me olvido que incluso existe, al igual que todos los compiladores que uso. –

1

Los espacios de nombre han estado alrededor de para siempre. Algunos de los lugares más oscuros en las plantillas, tal vez. Pero espacios de nombres? De ninguna manera. Incluso con plantillas, la gran mayoría de los escenarios de uso están bien. Algunos compiladores no son perfectos (son software), ¿pero no son compatibles con una característica de C++ 03 que no se exporta? Eso simplemente no sucede. La mayoría de los compiladores extienden el idioma, no reducen, y se están moviendo para admitir C++ 0x.

RTTI y las excepciones a menudo se acusan de implementaciones poco eficientes, pero no de conformidad de implementación deficiente.

1

Si está programando en la secuencia principal con un compilador de flujo principal, generalmente encontrará todo en el estándar C++ 03 admitido (excepto la exportación mencionada por sbi (pero entonces nuevamente nadie usó la característica (ya que no compatible)). Cuanto más lejos esté de la secuencia principal, menos compilador tendrá el compilador (pero todos avanzarán (algunos más lentamente que otros))

Solo cuando llegue a un hardware menos utilizado que tenga su propio propietario el compilador que admite características comienza a disminuir.

El principal ejemplo serían los dispositivos móviles y sus compiladores asociados (aunque debido a su popularidad en la secuencia principal en rec años que estos compiladores se actualizan más rápido que antes).

Un segundo ejemplo sería por los dispositivos SOC. Los compiladores son tan específicos que generalmente son compiladores internos y solo obtienen tanto trabajo como la compañía SOC puede permitirse y, como resultado, tienden a retrasarse (o al menos más) detrás de otros compiladores.

+0

¡De ninguna manera Martin! Ser realistas. Estoy usando el último OSX Snow Leopard y el gcc que viene con él no admite ninguna característica de C++ 03 en absoluto. Y como solo tengo conexión inalámbrica a Internet, no puedo actualizarla, incluso si Apple se molesta (lo cual no es posible). – Yttrill

+2

@Yttrill: si no recuerdo mal, Apple usa GCC 4.2.1, que [fue lanzado el 18 de julio de 2007] (http://gcc.gnu.org/gcc-4.2/). A menos que esté usando una versión anterior de GCC 3, lanzada alrededor de 2000 (lo que dudo), estoy bastante seguro de que su GCC admite muchas funciones de C++ 03. ¿Tal vez estás hablando de C++ 0x? – peoro

+2

@Yttrill: debe ser normas confusas. Los espacios de nombres, plantillas, RTTI y excepciones están disponibles prácticamente en todas partes, incluido OSX. –

Cuestiones relacionadas