2009-08-13 16 views

Respuesta

24

GCC tiene la opción -Wold-style-cast que le avise si encuentra cualquier estilo C arroja.

+0

Pero estoy utilizando Visual C++ (MFC) :( –

+0

Es posible que desee comprobar los C modificadores del compilador de Visual C++ para ver si hay uno para desactivar esta advertencia o si tienen uno que puede especificar deshabilitar ciertas advertencias Si no existe dicho conmutador, puede desactivar la advertencia con un pragma en los archivos que están causando la infracción. He utilizado con Visual C++ para desactivar algunas advertencias sobre la longitud de los nombres STL al compilar – Glenn

7

No conozco un modificador de compilador que informe de esto, o de cualquier otra cosa incorporada en Visual Studio.

Sin embargo, aquí es una Perl script que buscar su árbol de fuentes y encontrar todo el estilo C arroja en su fuente. Funciona bastante bien para rastrearlos.

6

Desafortunadamente, no hay una advertencia de compilación en Visual C++ que señale estos moldes (al menos ninguno que yo sepa), aunque parece que PC-Lint proporciona una advertencia/nota que advierte si utiliza un elenco antiguo. Depende de si usted está dispuesto a gastar el dinero en PC-Lint - en mi opinión, es definitivamente vale para todos los problemas que puede encontrar con él ...

-9

¿Por qué necesita eso? ¿Desea deshacerse de todos ellos?

Los moldes de estilo C para tipos fundamentales como (double) son seguros y se ven mucho mejor que static_cast<double>(). Yo personalmente prefiero este estilo.

En caso de clases polimórficas, el problema de la C-estilo arroja es exagerado groseramente en mi humilde opinión. Puede ser un problema solo si usa herencia múltiple y tiene que hacer cross-casting. Por defecto, los moldes de estilo C no funcionarán allí. Pero en la mayoría de los casos () funciona exactamente como static_cast<>() y no perdería tiempo en reemplazarlos. De todos modos, para los tipos polimórficos, utilizo moldes de estilo C++ cuando escribo un nuevo código o cambio algo.

ACTUALIZACIÓN:

chicos, parece que expresé mi opinión no es tan clara. Sí, conozco la teoría: C++: el yeso es bueno, C-cast es malo. Esta regla (y la mayoría de las demás) es necesaria para salvar a los novatos de C++. Pero eso no significa que siempre necesites seguirlo.

Mi punto es que los moldes de estilo C no son tan terribles. Si escribe alguna función como

int convertFooToBar(double i_foo) 

, no hay motivos para utilizar moldes de estilo C++ en la implementación. No son más seguros que (int) pero parecen desordenados. Casting no es complicado en tal caso. No es nada malo o complicado en el casting: a veces los moldes son naturales.

acerca de las búsquedas: No recuerdo que yo estaba buscando cualquier declaración fundido en los últimos 10 años, aunque estoy manteniendo varios millones de líneas de código C++ legado en base diaria. Ni siquiera recuerdo ningún problema serio debido a un casting incorrecto.

La pregunta original trata de reemplazar los moldes de estilo C ya escritos. Entonces, mi respuesta es:

Sí, los moldes de estilo C++ son mejores y más seguros que los de estilo C. Pero no significa que necesita buscar para los antiguos en su código y tratar de deshacerse de todos ellos. En realidad, no es un problema real. Simplemente no pierdas tu tiempo.Puede gastarlo en buscar y eliminar algún código desactualizado. Sería más útil para tu código base.

+6

si bien podría funcionar como un static_cast, el problema es que esto podría cambiar en silencio a trabajar como un reinterpret_cast cuando cambia algún código circundante. el problema es que no se expresan adecuadamente lo que quiere, y el compilador es libre para realizar cualquier el yeso es el mejor ajuste. Cambiar algún código circundante, y tu C-cast cambia su significado y rompe tu código. Y, por supuesto, un problema de bonificación es el tema de esta pregunta: ¿Son imposibles de buscar. Es un poco incómodo no poder ubicar los moldes que usa, especialmente cuando son tan propensos a errores. – jalf

+14

y finalmente, es * intencional * que son feos. Los repartos * son * un truco feo. Deberían verse feos para dejar en claro que están sucediendo y para desalentarlos de abusar de ellos. ;) – jalf

+10

este mismo problema, donde el usuario no puede encontrar los moldes en su código, es una de las razones para favorecer el C++ arroja estilo. – JohnMcG

Cuestiones relacionadas