2010-03-04 12 views
12

Sé que static const int x = 42; en el ámbito del espacio de nombres es equivalente a const int x = 42; porque las variables const son implícitamente static (deben declararse extern para que se les dé un enlace externo). Cada unidad de traducción que incluye esta declaración obtiene una copia local de x.¿No es una variable const en el ámbito del espacio de nombres implícitamente estática?

¿Esto solo se aplica a ciertos tipos (tal vez entero?)? Tengo el siguiente código en un archivo de cabecera:

namespace XXX { 
    static const char* A = "A"; 
    static const char* B = "B"; 
    static const char* C = "C"; // and so on 
} 

(POR FAVOR ahorrarme los comentarios sobre por qué no debería usar cadenas estilo C - Este es el código heredado)

Esta cabecera es incluido desde varios archivos fuente, y todo está bien (cada unidad de compilación obtiene su propia copia de estos char*). Hubiera pensado que podría eliminar el static de estos, ya que es redundante, pero cuando lo hago, obtengo errores de enlace sobre los símbolos que ya están definidos en otro objeto. ¿Que me estoy perdiendo aqui? ¿Están estos const char*no implícitamente estáticos?

+2

C cadenas son malvadas. Harán que tus dientes se pudran, que la piel se arrugue y robarán dulces a los bebés. Es una pena que pienses que podrías usarlos en el código heredado. Debe pasar varios años reescribiendo su proyecto con cadenas puramente de C++. :-) –

+11

En realidad, la creación de constantes con nombre para los valores de cadena es un buen uso de cadenas de caracteres *. Si usa std :: string, se creará una instancia de cadena, utilizando la asignación de memoria dinámica, en cada unidad de traducción que # incluya las definiciones de cadena. Esto es un desperdicio, y en el caso de un problema de asignación de memoria, difícil de diagnosticar. –

Respuesta

17

En su ejemplo, está creando un puntero a un carácter constante (bloque de) en lugar de crear un puntero constante a un carácter. Por lo tanto, su puntero no es constante y, por lo tanto, no es implícitamente estático.

Debe declarar x como const char *const A, que crea un puntero constante a una constante (bloque de) char.

+1

Sí. Eso creará un puntero constante a un bloque de caracteres constantes, que es lo que desearía para un literal de cadena. –

Cuestiones relacionadas