2011-03-19 49 views
7

¿Por qué una estructura vacía en C es una violación de restricción? ¿Por qué se cambia esta regla en C++?Estructura vacía en C vs estructura vacía en C++

¿Hay alguna razón histórica?

+0

http://stackoverflow.com/questions/755305/empty-structure-in-c –

+0

posible duplicado de [¿Cuál es el tamaño de una estructura vacía en C?] (Http://stackoverflow.com/questions/ 1626446/what-is-the-size-of-an-empty-struct-in-c) – Nawaz

+2

@Nawaz: Esta es una pregunta diferente. La pregunta real es "por qué" no "qué". –

Respuesta

8

ya que no tiene herencia en C, no las necesita. Si solo desea tener un tipo de puntero distinguible, puede usar punteros para tipos incompletos.

struct opaque; 

struct opaque* stranger = 0; 

debería funcionar bien.

+0

+1 de mí: Ganaste mi argumento con @Nawaz :) –

+0

+1 por recordarme esto! – Nawaz

+0

Pensé que eres un macroexperto.¿Podría ver http://stackoverflow.com/questions/5355241/generating-function-declaration-using-a-macro-iteration si hay alguna mejora posible? ¡Gracias! –

3

Mi opinión es la siguiente:

En C, no hay herencia, plantillas, y la sobrecarga de funciones - tres razones principales que utilizamos estructuras vacías en C++ - como una interfaz de base, como un parámetro de plantilla, como una escriba para ayudar a sobrecargar la resolución.

¿Puedes pensar en algún uso real de una estructura vacía en C?

+0

Estructuras vacías se pueden utilizar manejar, ¿no? [Maneja la comparación: clases vacías vs. clases indefinidas vs. vacío *] (http://stackoverflow.com/questions/4525847/handles-comparison-empty-classes-vs-undefined-classes-vs-void) – Nawaz

+0

@Nawaz: Tal vez, tal vez, mencioné específicamente que esto era solo una suposición :) –

+0

@Armen: Eso significa que su conjetura parece estar equivocada. Las estructuras vacías en C se pueden usar en muchas ocasiones, ¡especialmente cuando se usa 'void *'! – Nawaz