Parent topic ko appreciate karne se pehle, tumhe ideas ki ek chhoti si chain mein fluent hona chahiye. Hum unhe ek-ek link karke build karte hain, har ek agli ko earn karta hua. Neeche kuch bhi assume nahi karta ki tum pehle se C++ jargon jaante ho — hum build-pipeline ke words bhi define karte hain jab we hit them.
Topic ko iske liye kyun chahiye: "internal linkage", "translation unit", aur "mangled symbol" sab in stages ke terms mein define hain. Pehle stages ko naam dena jargon assume nahi karne ka promise rakhta hai.
Topic ko iske liye kyun chahiye: anonymous namespace ka poora promise — "private to this file" — meaningless hai jab tak tum exactly nahi jaante ki "this file" kya hai. Boundary translation unit hai, disk par raw .cpp nahi.
Poori kahani ke liye dekho Translation units and the One Definition Rule.
Topic ko iske liye kyun chahiye: ODR wo dushman hai jise anonymous namespace defeat karta hai. Agar ODR exist nahi karta, hume file-private names ki zaroorat nahi hoti. Dekho Translation units and the One Definition Rule.
namespace lib { void process(); // full name hai lib::process}lib::process(); // :: se andar pahuncho
Topic ko iske liye kyun chahiye: inline aur anonymous namespaces special folders hain. Tum ek special folder tab tak nahi samajh sakte jab tak ek plain wala nahi jaante. Shuroo karo Namespaces (basics) se.
Topic ko iske liye kyun chahiye: parent note anonymous namespace ko static ke modern replacement ke roop mein pitch karta hai. Tumhe pata hona chahiye ki static kya karta tha — aur uski limit (no types) — taaki dekh sako ki replacement kyun behtar hai. Full detail: static keyword (storage & linkage).
Topic ko iske liye kyun chahiye: ye parent topic ke do stars mein se ek hai. Upar sab kuch (linkage, ODR, static) exist karta hai taki ye definition land kare.
Topic ko iske liye kyun chahiye: ye parent topic ka doosra star hai — API versioning ke peeche ka mechanism. Iske members abhi bhi externally linked hain (step 3), isliye agle do steps matter karte hain.
Topic ko iske liye kyun chahiye: parent ka key claim — "inline naam mangled symbol ka part hai, isliye mismatched versions silently mix nahi honge" — invisible hai jab tak tum nahi jaante ki mangling exist karta hai. Dekho Name mangling and the ABI.
Neeche ka map top to bottom padhta hai: upar ke plain ideas (ek name, ek namespace, ek translation unit) middle-layer rules ko feed karte hain (linkage, ODR, mangling), jo baad mein do headline features (anonymous aur inline namespaces) ko feed karte hain jo parent topic banate hain. Kisi bhi arrow ko "samajhne ke liye zaruri hai" ki tarah follow karo.
Alt-text (agar diagram render nahi hota): "Name" teen mein split hota hai: "Symbol", "Namespace folder", aur "Translation unit". "Translation unit" "Linkage" ki taraf jaata hai, jo "One Definition Rule" ki taraf jaata hai; "static keyword" bhi "Linkage" ki taraf jaata hai. "Namespace folder" plus "Linkage" plus "ODR" "Anonymous namespace" ko feed karte hain. "Namespace folder", "Name mangling" (jo "Symbol" se fed hai), "ADL", aur "API versioning" sab "Inline namespace" ko feed karte hain. Dono "Anonymous namespace" aur "Inline namespace" final node "Inline and anonymous namespaces" ko feed karte hain.
Self-test: kya tum parent note kholne se pehle har ek ka jawab de sakte ho?
Teen build-pipeline stages, order mein, hain ::: preprocessor (headers/macros paste karta hai), phir compiler (source → object file), phir linker (object files → ek program).
C++ mein ek "name" hai ::: ek source-level label (identifier) jo tum type karte ho ek variable, function, ya type refer karne ke liye.
Ek "symbol" hai ::: ek shared name se produce ki gayi linker-level decorated string — linker padhta hai, tum nahi.
Ek translation unit hai ::: ek .cpp file preprocessor ke baad jab usne saare #include paste kar diye — wo chunk jise compiler independently process karta hai.
Teen tarah ke linkage hain ::: no linkage (block-scope names/parameters), internal linkage (ek TU ke liye private), external linkage (TUs ke paas shareable).
One Definition Rule kehta hai ::: ek externally-linked cheez ek baar define ho sakti hai, EXCEPT inline functions/variables, templates, aur class definitions, jo identically repeat ho sakte hain (ek per TU).
:: operator ka matlab hai ::: "andar" — scope resolution, ek namespace (folder) ke andar ek name tak pahunchna.
Ek global par static deta hai ::: internal linkage, lekin use ek type/struct par apply nahi kiya ja sakta.
Ek anonymous namespace hai ::: ek nameless namespace { } jiske members internal linkage paate hain — file-private, aur types ke liye bhi kaam karta hai.
Ek inline namespace hai ::: ek inline namespace { } jiske members enclosing namespace mein bhi unqualified appear karte hain — versioning/default mechanism.
Name mangling hai ::: compiler ka ek name ke namespace aur argument types ko actual linker symbol mein encode karna.
ADL hai ::: unqualified-call lookup jo argument types ke namespaces mein bhi dhundta hai.
API versioning hai ::: naya interface ship karna jab purane callers kaam karte rahein, ek chosen default version ke saath.
Jab har reveal tumhare paas instantly aaye, jao padho the parent topic.