sirve que programming program para learncpp how from for estructuras ejemplos beginners arreglo c++ compiler-warnings

que - how to program in c++



Advertencia C4099: nombre de tipo visto por primera vez usando ''clase'' ahora visto usando ''struct''(MS VS 2k8) (7)

¿Es esta advertencia algo de lo que preocuparse? He leído que puede causar un comportamiento errático.

Es un ejemplo que estoy tratando de compilar, ¿podría alguien explicarme por qué el autor declara el objeto como una clase pero luego lo escribe como una estructura? ¿Es perfectamente normal hacerlo si la clase es POD ?

Gracias.


Aunque esto se considera una mala práctica, creo que no debería haber problemas para mezclar definición de clase y declaración de estructura, ya que básicamente son del mismo tipo de datos. La principal diferencia es que los miembros de la estructura son por defecto públicos, a diferencia de los miembros de la clase que son privados, pero por lo demás el diseño de la memoria es idéntico.


En c ++, la única diferencia entre una clase y una estructura es que los miembros y las funciones de la clase son privados por defecto, mientras que en una estructura son públicos por defecto; entonces, el hecho de que la clase sea POD no debería hacer ninguna diferencia aquí.
Supongo que esta advertencia proviene del mantenimiento del código (definición actualizada en algún lugar, pero no en otro lugar), y corrige el código para que desaparezca la advertencia (por ejemplo, utilizando la clase en typedef).


Esta advertencia aparece cuando tiene una declaración de un tipo que contradice a otra (una dice "clase", la otra dice "estructura"). Dada la regla de una definición, todas las declaraciones excepto a lo sumo uno deben ser declaraciones directas. La advertencia generalmente indicará que una declaración adelantada de un tipo es incorrecta y suele ser un error tipográfico y debe corregirse. En este caso, no debería haber efectos secundarios, pero realmente debería solucionarlo.

Sin embargo, puede haber algunas cosas muy desagradables si tiene conflictos de nombres de tipos (tal vez causados ​​por el uso de cláusulas de "uso de espacio de nombres" o contaminación del espacio de nombres global). Estas advertencias pueden indicar que está mezclando encabezados de dos bibliotecas diferentes y los nombres de tipo tienen conflictos. El código compilado bajo estas condiciones podría hacer algunas cosas muy inesperadas.

Mi consejo: comprenda por qué apareció la advertencia y corrígela. Si la advertencia está en un producto de un tercero, insista en que lo solucionen.


Richard Corden está en lo correcto: hay una razón por la cual MS tiene esta advertencia. Los nombres decorados (triturados) incluyen qué clave de clase (struct o clase) es un nombre de tipo. Si una función o método que toma algún objeto como argumento o devuelve ese objeto se referencia en algún lugar cuando la clave de clase incorrecta está visible, no obtendrá un error de compilación pero el enlazador se quejará porque los nombres decorados son diferentes. El error del enlazador solo muestra el símbolo que está buscando, y es fácil pasar por alto la falta de coincidencia de clave de clase allí, por lo que la advertencia anterior, más detallada del compilador es valiosa. Todavía es posible que las dos versiones no aparezcan en la misma unidad de compilación, por supuesto, y es probable que te estés rascando la cabeza por un tiempo si crees que la única diferencia es la visibilidad predeterminada de los miembros.



Una cosa que he visto que puede causar esta advertencia es tratar de importar el archivo .tlb de una DLL y tener la misma DLL como referencia en tu proyecto. Acabo de solucionar un problema al eliminar el archivo DLL como referencia dentro de mi proyecto.


Solo para llevar el comentario de MSalters en contra de esta publicación al nivel superior. He tenido varios errores de enlazador difíciles de encontrar como resultado de que VC usa la palabra clave ''class'' o ''struct'' en su manipulación de nombres.

¡Si no esperas que sea un problema, puedes quedarte rascándote la cabeza durante horas!