2012-05-10 10 views
8

Aquí hay muchas preguntas sobre estática vs global, pero creo que mi pregunta es un poco diferente.Compartiendo variables estáticas entre archivos: espacio de nombres vs clase

Quiero saber si hay una manera de compartir una variable colocada en un espacio de nombres en los archivos de la misma manera que las variables estáticas en una clase.

Por ejemplo, he codificado esto:

//Foo.h 
class Foo 
{ 
    public: 
    static int code; 
    static int times_two(int in_); 
}; 

namespace bar 
{ 
    static int kode; 
} 

-

//Foo.cpp 
int Foo::code = 0; 

int Foo::times_two(int in_) 
{ 
    bar::kode++; 
    code++; 
    return 2*in_; 
} 

-

//main.cpp 
int main() 
{ 
    cout << "Foo::code = " << Foo::code << endl; 

    for(int i=2; i < 6; i++) 
    { 
    cout << "2 x " << i << " = " << Foo::times_two(i) << endl; 
    cout << "Foo::code = " << Foo::code << endl; 
    cout << "bar::kode = " << bar::kode << endl; 

    if(i == 3) 
    { 
     bar::kode++; 
    } 
    } 
} 

Todo lo que produjo este código y para Kode:

Foo::code = 1,2,3,4 
bar::kode = 0,0,1,1 

Una vez más, ¿hay alguna manera de compartir una variable colocada en un espacio de nombres en los archivos de la misma forma que las variables estáticas en una clase? La razón por la que pregunto es porque pensé que sería capaz de protegerme de variables globales conflictivas usando :: notación, y descubrí que no podía. Y como cualquier programador que no respete a nadie, creo que lo estoy haciendo mal.

+1

'static' es probablemente la única palabra clave más sobrecargada en C++. Significa algo diferente en ambos contextos. – Flexo

+1

... y en este caso particular, justo lo contrario de lo que desea. –

Respuesta

19

Sí:

//bar.h 
namespace bar 
{ 
    extern int kode; 
} 

Fuera de un class o struct, static tiene un significado completamente diferente. Da un enlace interno simbólico. Por lo tanto, si declara la misma variable como static, en realidad obtendrá una copia diferente para todas las unidades de traducción, no una única global.

Tenga en cuenta que tendrá que inicializar la variable vez:

//bar.cpp 
namespace bar 
{ 
    int kode = 1337; 
} 
+4

@Morpork: tenga en cuenta que 'kode' se declara' extern' aquí, no 'static'. Eso es importante. –

+0

@John Sí, tenía la sensación de que no se podía evitar la externalidad cuando se trata de varios archivos. Excepto por una variable estática en una clase de curso. Gracias por las respuestas muy rápidas, todo. – Morpork

+2

@Morpork Realmente no entiendo por qué la gente quiere evitar extern .... –

Cuestiones relacionadas