Browse DevX
Sign up for e-mail newsletters from DevX

Tip of the Day
Home » Tip Bank » C++
Language: C++
Expertise: Intermediate
Jan 3, 2000



Building the Right Environment to Support AI, Machine Learning and Deep Learning

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.cpp

const int x=0; 

// File b.cpp
const int x = 2;  

// File main.cpp
int 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.

Danny Kalev
Comment and Contribute






(Maximum characters: 1200). You have 1200 characters left.



Thanks for your registration, follow us on our social networks to keep up-to-date