2010-11-02 16 views
6

C++ 0x draft¿Por qué las uniones anónimas globales deben declararse como estáticas?

9.5.6 uniones anónimas declaradas en un espacio de nombres con nombre o en el espacio de nombres global se declararán estática.

¿Por qué?


Update-

Sobre la base de Bart van Ingen Schenau y respones Lothar, la mejor explicación hasta el momento podría ser la siguiente:

Si la misma unión anónima mundial se encuentra en dos unidades de traducción (por ejemplo , a través de un archivo de encabezado), entonces, ¿cómo se puede cumplir la Regla de una sola definición? ¿Las dos definiciones son tratadas como iguales y fusionadas? ¿O las dos definiciones son tratadas como diferentes? Si se los trata como iguales, entonces el compilador presumiblemente está haciendo 'magia', de lo contrario no se aplica a otras entidades. Si se los trata como iguales, entonces el compilador lo hace sin el consentimiento explícito del programador ... por lo que supongo que se requiere el consentimiento explícito al exigir que se declare como estático.

Respuesta

1

Mi conjetura es que si se le permitiera definir la unión de una manera no estática que puede infringir la ODR (one definition rule)

+0

Esto más la respuesta de Bart van Ingen Schenau juntos podría ser la mejor explicación hasta el momento. – Vatsan

1

Mi mejor conjetura:

Si lo fuera no estática, que podría ser referenciado por otro código. Pero, ¿qué otro código lo llamaría? Es anónimo De ahí la necesidad de restringir una unión anónima a algún ámbito local; por lo tanto, se declarará estático.

Pero es solo una suposición. Los diseñadores de idiomas pueden diseñar las cosas de la manera que desean. Algunas veces sus elecciones son arbitrarias, solo porque se debe hacer alguna elección .

+0

No veo cómo se podría llamar el problema en una parte diferente del código, porque no se llama nada. Más bien, solo se hace referencia directa a los miembros y todos tienen nombres. Es la unión en sí misma, no sus miembros. – Vatsan

+0

Supongo que estoy tratando de obtener información sobre por qué esta función está diseñada tal como está. Por cierto, este comportamiento no es nuevo en C++ 0x (aunque he citado el borrador de C++ 0x), ha sido así desde hace un tiempo. – Vatsan

0

$ 9.5/5- Una unión de la forma union { member-specification}; se llama una unión anónima ; define un objeto sin nombre del tipo sin nombre.

Supongo que debe ser estático para que el objeto se pueda inicializar según la regla de los objetos estáticos globales. Si no es estático y el objeto no tiene un nombre, ¿cómo se inicializa?

Edit2:

En repensar ...

Los miembros de uniones anónimas tienen vinculación interna. Además, por defecto, los nombres globales tienen enlaces externos a menos que tengan enlaces internos. Si el nombre de la unión anónima tiene enlaces externos, no es posible que los miembros de la unión anónima tengan vínculos internos. Por lo tanto, las uniones anónimas se declaran con un especificador de clase de almacenamiento "estático", de modo que el nombre anónimo en sí mismo tiene un vínculo interno.

+0

maldición !. No sé cómo deshacerme de ese doble 'define' – Chubsdad

+0

Hacerlo estático le proporcionará 'inicialización cero'. Pero, ¿por qué es necesaria la inicialización predeterminada (cero)? Sus miembros pueden referirse a sus miembros, por lo que la primera vez que se le asigna un valor a un miembro de la unión anónima, se iniciará la unión anónima. ¿Qué me estoy perdiendo? – Vatsan

+0

@Vatsan Madhavan: la asignación es diferente de la inicialización – Chubsdad

4

uniones anónimas Supongamos que no estaban obligados a declarar estático, y el compilador encuentra estos dos traducción unidades (después de preprocesamiento):

Archivo1:

union { 
    int a; 
    char b; 
}; 

// Further contents referring to a and b 

Archivo2:

union { 
    int a; 
    char b; 
}; 

// Further (different) contents referring to a and b 

¿Son esas dos uniones el mismo objeto o se supone que son objetos diferentes?

Creo que, para evitar preguntas irrefutables como esta, se ha decidido que las uniones anónimas del espacio de nombres deban declararse estáticas.

+0

Creo que esto, en combinación con la respuesta ODR de lothar, podría ser la mejor explicación hasta ahora. – Vatsan

-1

Nunca hubo una justificación para el requisito de estática y debería eliminarse. El compilador debe, y debe, tratar los múltiples elementos en la unión como múltiples variables globales individuales que comparten la misma dirección. En la práctica, significa que el compilador permite que se apliquen varios tipos a la misma dirección. Dado que el alcance de una unión anónima global es el alcance global, las reglas para nombrar elementos en uniones anónimas deben ser (y son) las mismas que las reglas para nombrar variables globales. es decir, los nombres de los elementos de la unión anónima deben ser únicos. En cuanto a la inicialización de la unión, no hay diferencia entre la inicialización de una unión y de una variable simple. Otro punto sobre las uniones estáticas: el valor y el tipo de unión dependen del tiempo. Tenga en cuenta que solo un valor a la vez puede ocupar una unión independientemente de la cantidad de elementos en ella. La razón para declarar una unión para comenzar es permitir que la misma dirección se use para diferentes tipos, dinámicamente, en diferentes momentos. Esta es la razón por la cual una unión estática es un nombre inapropiado y algunos compiladores simplemente la ignoran.

Cuestiones relacionadas