Namespaces (namespace) zijn bedoeld voor het organiseren van code om naamsconflicten te voorkomen (vooral in grote projecten en bibliotheken). Gewone namespaces stellen ons in staat om klassen, functies, variabelen, enz. te groeperen.
Anonieme namespaces (namespace { ... }) worden gebruikt om de zichtbaarheid binnen één bestand te beperken — alles wat daarin is gedeclareerd is niet zichtbaar buiten het bestand. Voorheen werd de static modifier gebruikt voor functies en variabelen op bestandsniveau, maar nu heeft de voorkeur een anonieme namespace.
// In mylib.cpp namespace { void helper() { // ... } int hidden_var = 42; }
Kun je zeggen dat het declareren van een functie/variabele met static op bestandsniveau en in een anonieme namespace altijd hetzelfde effect heeft?
Antwoord:
Nee, er zijn verschillen. static beperkt de zichtbaarheid alleen tot het huidige bestand. Objecten binnen een anonieme namespace hebben dezelfde lokale zichtbaarheid, maar krijgen een unieke naam voor elk compilatiebestand, wat naamsconflicten tussen vertaalunits voorkomt. Tegelijkertijd ondersteunen anonieme namespaces geneste structuren en kunnen ze klassen bevatten, terwijl static dat niet kan.
Geschiedenis
-Bij het migreren van oude code gebruikte één module static voor een variabele, terwijl een andere module een soortgelijke variabele zonder static gebruikte. Dit leidde tot een linkfout door dubbele definitie van de variabele.
Geschiedenis
-In een groot project leidde het samenvoegen van verschillende bibliotheken tot onzichtbare conflicten tussen static-functies van verschillende bestanden (gelijke naam, verschillende implementaties). Hierdoor gedroeg één bibliotheek zich onvoorspelbaar na de compilatie.
Geschiedenis
-Een ontwikkelaar plaatste de class-declaratie in een anonieme namespace alleen in het .cpp-bestand, waardoor toegang tot de class vanuit andere bestanden onmogelijk werd en de architectuur van de module werd verstoord.