2012-08-15 17 views
11

palabra clave estática mantiene el alcance de una variable global limitada a esa unidad de traducción. Si uso static int x en un archivo .h e incluyo ese archivo .h en cualquier otro archivo, ¿no pertenecerán todos a la misma unidad de traducción? Entonces, ¿x no será visible en todas partes? Entonces, ¿cuál es el rol de la estática ahora?C++ - ¿Está bien para declarar la variable global estática en el archivo .h?

Además, ¿hay algún uso de static const int x, donde x es una variable global? ¿No están todas las variables globales de const estáticas por defecto? ¿Y el alcance de una variable const está limitado a la TU incluso si está confinado en un bucle for en el archivo?

+4

Encontré que el uso más común de la estática en los encabezados es introducir errores o dificultar la depuración. – PlasmaHH

Respuesta

31

Si se escribe

static const int x 

en un fichero .h entonces cada unidad de traducción que # include -s este .h tendrá su propia variable privada x.

Si usted quiere tener 1 variable global visible para todos debe escribir

extern const int x; 

en el archivo .h y

const int x = ...; 

en uno de los archivos.cpp.

Si desea tener un const int estático visible para una sola unidad de traducción, no lo mencione en los archivos .h.

3

terminará copias privadas de esa variable por traducción, lo que dará lugar a la hinchazón si la coloca allí. tampoco tendría sentido tener copias aleatorias por todos lados. no, no está bien.

puede declarar const int en un bloque namespace; está bien.

0

Básicamente, cada archivo fuente junto con todos los archivos de encabezado incluidos es una sola unidad de traducción. Por lo tanto, si tiene una variable estática en un archivo de encabezado, será único en cada archivo fuente (unidad de traducción) en el que se incluye el archivo de encabezado.

6

Si uso static int x en un archivo .h e incluyo que .h archivo cada otro archivo, ¿no pertenecerán todos a la misma unidad de traducción?

Si declara algo como estático (no dentro de una clase, porque la palabra clave estática tiene una semántica diferente), esa variable estática no se puede ver fuera de su TU. Entonces colocarlo en el archivo de encabezado causará que cada TU que incluye ese encabezado tenga una copia privada diferente de esa variable estática.

¿Y el alcance de una variable const está limitado a la TU incluso si limita en un bucle for en el archivo?

NO. Incluso para un valor constante const, el alcance está determinado por su declaración. Entonces, el alcance estará limitado por su paréntesis.

1

La diferencia observable para las variables calificadas con const es que en la versión static obtendrá una copia por unidad de traducción y, por lo tanto, las comparaciones de direcciones de estas dos copias pueden fallar.

Si nunca usas la dirección de tu variable const, cualquier compilador moderno debería poder usar el valor y optimizar la variable. En tal caso, una variable calificada staticconst está completamente bien.

Cuestiones relacionadas