Consider two declarations named i: a local unsigned i initialized to 2, and a file-scope unsigned i initialized to 1. Inside the if block, extern unsigned i refers to the existing file-scope object, so the program prints 1; outside that declaration, the local name refers to the object initialized to 2. TAKEAWAY: linkage determines whether declarations designate the same entity. section 13.2
The essential distinctions are:
- External linkage lets declarations in different object files designate the same object or function; the linker establishes that correspondence. section 13.2
- Internal linkage keeps a file-scope object or function connected only within its translation unit. section 13.2
- Identifiers without cross-scope or cross-file identity have no linkage. Linkage belongs to identifiers, not to the objects they represent. section 13.2
- Do not equate static storage duration with the static storage-class specifier: static can enforce internal linkage, while duration describes an object's lifetime. section 13.2

