Własna przestrzeń nazw w kilku plikach

0

Cześć,
Mam problem z poprawnym zadeklarowaniem własnej przestrzeni nazw w taki sposób, aby dostępna ona była w kilku plikach źródłowych projektu.
Załóżmy, że mamy trzy pliki.
Nagłówkowy z deklaracją mojej przestrzeni:

//mojaPrz.h
#ifndef MOJAPRZ_H_
#define MOJAPRZ_H_

namespace mojaP
{
    int a;
    double b;
}

#endif

I dwa pliki źródłowe, do których dodaję:

#include "mojaPrz.h"
using namespace mojaP;

Przy próbie kompilacji wyskakuje błąd ponownej deklaracji a lub b.

1

Ponieważ masz 2 zmienne o takich samych nazwach. Zadeklaruj ją tylko w 1 i użyj słowa kluczowego extern.

0

Proponujesz zrezygnować z przestrzeni nazw?

Poza tym nie rozumiem, gdzie niby mam zadeklarowane te dwie zmienne o tej samej nazwie, skoro plik nagłówkowy ma dyrektywę #idndef.

Wklejam pliki z bardzo prostym przykładem, który próbuję kompilować:

//mojaPrz.h
#ifndef MOJAPRZ_H_
#define MOJAPRZ_H_

namespace mojaP
{
    int a;
}

#endif
//main.cpp
#include <iostream>
#include "mojaPrz.h"

void remote_access();

int main()
{
    using namespace std;
    using namespace mojaP;

    cout << &a << " = &a\n";
    remote_access();
    return 0;
}
//plik2.cpp
#include <iostream>
#include "mojaPrz.h"

void remote_access()
{
    using namespace std;
    using namespace mojaP;

    cout << &a << " = &a\n";
}

Komunikat błedu:

obj/Debug/plik2.o||In function `remote_access()':|
plik2.cpp|6|multiple definition of `mojaP::a'|
main.cpp|8|first defined here|
||=== Build finished: 2 errors, 0 warnings ===|
0

Proponujesz zrezygnować z przestrzeni nazw?

Która część odpowiedzi winerfresha coś takiego sugeruje?

0

Zdanie "Zadeklaruj ją tylko w 1 i użyj słowa kluczowego extern." można odczytać na co najmniej dwa sposoby (pierwszy plik? jeden plik?). Druga część tego zdania dotyczy pliku nagłówkowego a pierwsza dowolnego innego. Uwierz mi, że początkujący programista po otrzymaniu takiej odpowiedzi może mieć różne pomysły.

Dla zainteresowanych, powinno wyglądać to tak:

//main.cpp
#include <iostream>
#include "mojaPrz.h"
int mojaP::a;

A nagłówkowy:

//mojaPrz.h
namespace mojaP
{
    extern int a;
}

Swoją drogą, to konstrukcja ta wygląda trochę dziwnie, ponieważ główna deklaracja a pojawia się dopiero po deklaracji extern, która się do niej odnosi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1