...
#include "test1.h"
int main(..)
{
count << aaa <<endl;
}
aaa
is defined in test1.h
,and I didn't use extern keyword,but still can reference aaa
.
So I doubt is extern
really necessary?
...
#include "test1.h"
int main(..)
{
count << aaa <<endl;
}
aaa
is defined in test1.h
,and I didn't use extern keyword,but still can reference aaa
.
So I doubt is extern
really necessary?
extern
has its uses. But it mainly involves "global variables" which are frowned upon. The main idea behind extern
is to declare things with external linkage. As such it's kind of the opposite of static
. But external linkage is in many cases the default linkage so you don't need extern
in those cases. Another use of extern
is: It can turn definitions into declarations. Examples:
extern int i; // Declaration of i with external linkage
// (only tells the compiler about the existence of i)
int i; // Definition of i with external linkage
// (actually reserves memory, should not be in a header file)
const int f = 3; // Definition of f with internal linkage (due to const)
// (This applies to C++ only, not C. In C f would have
// external linkage.) In C++ it's perfectly fine to put
// somethibng like this into a header file.
extern const int g; // Declaration of g with external linkage
// could be placed into a header file
extern const int g = 3; // Definition of g with external linkage
// Not supposed to be in a header file
static int t; // Definition of t with internal linkage.
// may appear anywhere. Every translation unit that
// has a line like this has its very own t object.
You see, it's rather complicated. There are two orthogonal concepts: Linkage (external vs internal) and the matter of declaration vs definition. The extern
keyword can affect both. With respect to linkage it's the opposite of static
. But the meaning of static
is also overloaded and -- depending on the context -- does or does not control linkage. The other thing it does is to control the life-time of objects ("static life-time"). But at global scope all variables already have a static life-time and some people thought it would be a good idea to recycle the keyword for controlling linkage (this is me just guessing).
Linkage basically is a property of an object or function declared/defined at "namespace scope". If it has internal linkage, it won't be directly accessible by name from other translation units. If it has external linkage, there shall be only one definition across all translation units (with exceptions, see one-definition-rule).