The Default Linkage Type of non-local const Objects

The Default Linkage Type of non-local const Objects

In C++ (but not in C), a const object declared in the global scope has internal linkage by default. This means that a const object which apparently looks like a global one is in fact visible only in the scope of its translation unit; it isn’t visible in other translation units unless it’s explicitly declared extern. For example:

 // File a.cppconst int x=0; // File b.cppconst int x = 2;  // File main.cppint main(){}

Both a.cpp and b.cpp define a const variable called x. However, the two definitions refer to distinct variables, each of which has a different value and is visible only from the scope of its source file. Now if you remove the const qualifier from the definition of both x’s, recompile all the source files and re-link them, you will receive a linker error: “Public symbol x defined in both module a.obj and b.obj”. This is because x has external linkage when it’s not declared const. Therefore, it’s visible from every source file in the project. Because x is defined twice, the linker complains about multiple definitions.

There are two lessons from this example. First, if you wish to make a const object declared in the global scope globally accessible, you must declare it extern. Secondly, never declare non-local const objects static, as in:

   static const int x = 0; // bad programming practice

Declaring a non-local object static is both redundant and deprecated.

See also  How to Avoid Money Transfer Scams  

About Our Editorial Process

At DevX, we’re dedicated to tech entrepreneurship. Our team closely follows industry shifts, new products, AI breakthroughs, technology trends, and funding announcements. Articles undergo thorough editing to ensure accuracy and clarity, reflecting DevX’s style and supporting entrepreneurs in the tech sphere.

See our full editorial policy.

About Our Journalist