El problema que tengo es básicamente el mismo que 'greentype' menciona en http://www.cplusplus.com/forum/beginner/12458/espacios de nombres con enlace externo
estoy compartiendo las variables a través de espacios de nombres y surge un problema cuando trato de poner mis definiciones de funciones en un archivo separado .
Considere el siguiente ejemplo, donde quiero pasar la variable 'i', que se define en el código principal, a la función a():
* nn.h: *
#ifndef _NN_H_
#define _NN_H_
namespace nn {
int i;
}
#endif
* * main.cpp
#include <iostream>
#include "nn.h"
using namespace std;
using namespace nn;
void a();
int main()
{
i=5;
a();
}
void a()
{
using namespace std;
using namespace nn;
i++;
cout << "i = " << i << endl;
}
Pero ahora si pongo la definición de un() en un archivo separado ...
* * a.cpp
#include <iostream>
#include "nn.h"
void a()
{
using namespace std;
using namespace nn;
i++;
cout << "i = " << i << endl;
}
... entonces obtengo un error de "definición múltiple" al enlazar (g ++ main.cpp a.cpp -o main). Si hago la declaración 'i' en el archivo de encabezado 'extern' (como sugerido en otros foros), aparece un error de 'referencia no definida'. Puedo compilar cuando 'i' se declara como const en el encabezado, pero eso no es lo que quiero.
Cualquier sugerencia muy apreciada.
Así que la única manera de hacerlo funcionar es hacer que 'i' sea global, es decir, ponga la definición 'namespace nn {int i = 5;}' en main.cpp, sobre int main() (y haga declaración 'extern'). Pero observe que en el ejemplo original (donde la función a() está en el MISMO ARCHIVO que main()), 'i' no era global - lo definí dentro de main(), y aun así pude compartirlo con, y modificar in, a() a través del espacio de nombres. Ese es el marco que necesito retener, porque realmente no puedo hacer que 'i' sea global, ya que (y otras variables que tengo y necesito compartir) se CALCULA en main() - No conozco sus valores de antemano . –
No, no * definiste * it en 'main', simplemente lo usaste en' main'. La definición todavía estaba en 'nn.h' y todavía era una variable de ámbito de espacio de nombres (es decir, no una función local). Aún puede calcular valores y asignarlos a variables con ámbito de espacio de nombres en una función como main. Sin embargo, es mejor tener 'i' como una variable local en' main' y pasarlo (o una referencia) a 'a'. –
@PetrH, para ser precisos, no era global porque estaba definido en 'nn', no porque estaba definido en' main' (como se ha dicho, simplemente es * used * allí). Para hacer que 'i' sea global, debe ponerlo * fuera * en cualquier espacio de nombres definido por el usuario. Ponlo por encima del espacio de nombres 'nn', por ejemplo. Actualmente, 'i' no es global, pero aún tiene un espacio de nombre con ámbito (no local). –