[C++] Namespaces in headers

Pagina: 1
Acties:

  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 24-05 19:43

GrimaceODespair

eens een tettenman, altijd ...

Topicstarter
Ik zit met de volgende programmeertechnisch-filosofische overdenking (sic):

Als je met C++ een DLL maakt, maak je uiteraard ook bijbehorende header. Stel nu dat je daarin gebruik maakt van elementen uit namespace NamespaceA, zoals een functie g. Is het dan meer logisch om in je header
C++:
1
2
using namespace NamespaceA;
int f() { return g(); }
te doen, of is er meer te zeggen voor
C++:
1
int f() { return NamespaceA::g(); }
Dan is er trouwens ook nog de mogelijkheid om dit te doen:
C++:
1
2
3
4
int f() {
    using NamespaceA::g;
    return g();
}

In geval 1 bespaar je je een hoop werk, omdat je niet alles hoeft te prefixen. Maar stel dat je client van de bewuste DLL een NamespaceB bevat in dezelfde scope als waarin je DLL headers worden ge-include, en dat die NamespaceB ook een functie g() bevat. Dan zal de compiler klagen over ambiguïteit, waar je in geval 2, noch in geval 3 last van hebt.

Het probleem is bij mijzelf nog nooit voorgekomen, maar ik kan me voorstellen als je met veel libs van verschillende vendors werkt, dat je er wel eens tegenaanloopt. En als iemand hier relevante ervaring mee heeft, dan kan ik mijn DLL headers in de toekomst daar natuurlijk op afstemmen.

Vragen
  1. Heeft iemand wel eens last gehad van namespace clashes?
  2. Welke methode gebruikt de gemiddelde C++ lib-ontwikkelaar?
  3. Zoek ik problemen waar er geen zijn?

Wij onderbreken deze thread voor reclame:
http://kalders.be


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
De regel is vrij simpel: NOOIT een using-directive op global scope zetten in een header. 2&3 zijn je eigen keuze. Sowieso zijn inlines in je header file klein, dus dan oplossing 2 korter dan 3. 3 wordt pas interessant bij grote functies, en als je die al hebt, staan ze in de .cpp

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ikzelf prefix standaard alles, ook gewoon in source files, tenzij de namespace naam te lang wordt en ik bepaalde objecten uit die namespace veel gebruik.

En idd, een using directive (en declaration trouwens ook imho) in je headers op global scope is evil, omdat ze members uit een andere namespace overhevelen naar de huidige namespace, waardoor ze ook aangesproken kunnen worden via de huidige namespace. En dat is meestal nou net wat je niet wilt hebben. Hetzelfde doen met de global namespace is helemaal uit den boze, omdat je dan de hele global namespace infecteert, en het idee van namespaces dus gelijk weg is

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.


  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 24-05 19:43

GrimaceODespair

eens een tettenman, altijd ...

Topicstarter
.oisyn schreef op 22 August 2003 @ 14:08:
Ikzelf prefix standaard alles, ook gewoon in source files
Ok, blij dat iemand met wat ervaring dit zegt. Dan hoef ik mij tenminste niet af te vragen of ik de enige gek ben die zich daarmee bezighoudt: ben net een kwartier bezig geweest om alles in een header file te prefixen :)

Wij onderbreken deze thread voor reclame:
http://kalders.be