There is one variable called BOT_TIME that varies with the difficulty of my game, and hence isn’t const. There are many files that use it. I intend to use it as a global variable.
1) In constants.h I declare it extern int BOT_TIME.
In constants.cpp, I declare it extern int BOT_TIME.
BUILD => undefined references to the variable in all sources(Yes, I’ve included the header).
2) In constants.h I declare it int BOT_TIME.
In constants.cpp, I declare it int BOT_TIME.
Since non-consts are by default extern , I decided to leave that keyword.
BUILD => Multiple definition of the variable (shows in each source file that has constants.h included)
3) In constants.h I declare it extern int BOT_TIME.
In constants.cpp, I declare it int BOT_TIME.
This works.
Where is the issue?
Initializing the variable to something in constants.cpp makes it work for cases 1 and 3.
What is this happening?
Which is the right approach?
You can declare a variable as many times as you want, you can and have to define it only once.
is a declaration.
is a definition.
The definition has to appear in a single implementation file.
Nope. How’d you figure?
To answer the questions:
1) There’s no definition, only declarations.
2) The assumption is wrong. You define the symbol multiple times.
3) It works because that’s the correct way to do it.
From the comments:
When you declare a variable with
extern, you specify that it has external linkage, yes, but you only declare, and not define it. If you leave it without theexternkeyword, it still has external linkage, but it’s also a definition.