Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C++/MS VS 2005] Namespace problemen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Laat mij beginnen met te stellen dat ik normaal gesproken voornamelijk in C programmeer, en derhalve nooit eerder zelf namespaces heb gemaakt.

De situatie is als volgt.
Ik heb een set functies die met hardware communiceren. Deze heb ik ondergebracht in een .cpp file met een bijbehorende .h. Omdat de functienamen nogal generiek zijn, dacht ik ze onder te brengen in een namespace, zodat ik geen conflicten krijg.

MSSIRadio.h:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
#ifndef MSSIRADIO_H
#define MSSIRADIO H

namespace LLMSSIRadio {
    int some_var;

    int fpga_read( /* ... */);
    int fpga_write( /* ... */);
    // etc.
}

#endif


MSSIRadio.cpp:
C++:
1
2
3
4
5
6
#include "radio.h"

int LLMSSIRadio::fpga_read( /* ... */) {
    // ...
}
// etc.


Ik gebruik deze functies elders, door MSSIRadio.h te includen. Ik krijg dan echter meldingen dat some_var al gedefinieerd is.
Ik heb er omheen gewerkt door some_var in een functie onder te brengen, maar ik heb het vermoeden dat dat niet de aangewezen methode is.

Is mijn ontwerp fundamenteel fout?

Voor de volledigheid moet ik vermelden dat het complete ontwerp er meer zo uitziet:
code:
1
2
3
Main.cpp : includes -> Wrapper.h
Wrapper.cpp : includes -> Wrapper.h, MSSIRadio.h
MSSIRadio.cpp : includes -> MSSIRadio.h


Overigens, mijn ClassView in MS VS 2005 ziet er zo uit (een van de redenen waarom ik vermoed dat er iets fout zit):
Afbeeldingslocatie: http://img205.imageshack.us/img205/2227/classviewic0.png

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 30-11 20:54

.oisyn

Moderator Devschuur®

Demotivational Speaker

Vrij logisch, als je die namespace niet zou gebruiken zou je toch gewoon dezelfde error krijgen? Zelfs in C :). Je definieert een variabele in een header, ipv 'm te declareren

[ Voor 4% gewijzigd door .oisyn op 01-09-2007 00:52 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

C:
1
2
#ifndef MSSIRADIO_H
#define MSSIRADIO H


moet dat niet zijn:

C:
1
2
#ifndef MSSIRADIO_H
#define MSSIRADIO_H


Of misschien nog beter LLMSSIRADIO_H

[ Voor 10% gewijzigd door eek op 01-09-2007 12:38 ]

Skill is when luck becomes a habit.


Verwijderd

Een oplossing is om de variabelen het keyword 'extern' mee te geven en te definieren in je .cpp file. Googlen met 'C++ extern' moet bruikbare resultaten opleveren.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Variabelen definieren in een header file is (bijna?) nooit wat je wilt. Ieder die de header include krijgt zijn eigen variabele mee, en omdat ie standaard external linkage heeft heb je dus multiple definitions van dat ding.

Dit is trouwens voor C hetzelfde als C++

[ Voor 8% gewijzigd door farlane op 01-09-2007 13:34 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
Bedankt voor de tips, ik zie in wat ik fout heb gedaan. Blijkbaar heb ik in mijn enthousiasme iets nieuws te gebruiken andere dingen over het hoofd gezien. Of misschien doe ik dit wel niet vaak genoeg om er handigheid in te krijgen en het automatisch goed te doen :/.

@ eek: dat is een typfout. Ik had e.e.a. geabstraheerd, blijkbaar de _ vergeten.

  • RobLemmens
  • Registratie: Juni 2003
  • Laatst online: 19-11 09:29
eek schreef op zaterdag 01 september 2007 @ 12:29:


Of misschien nog beter LLMSSIRADIO_H
Of

#pragma once

en de rest van de defines dumpen.

[ Voor 6% gewijzigd door RobLemmens op 01-09-2007 16:35 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 30-11 20:54

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zodat je code lekker niet meer compiler-onafhankelijk is, joepie :). Als je al #pragma once gebruikt, laat de header guards er dan iig nog omheen staan, zodat je het altijd nog kunt compilen met een compiler zonder #pragma once support.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1