It's simple question but why would someone use #define to define constants?
What's the difference between
#define sum 1
and const int sum = 1;
It's simple question but why would someone use #define to define constants?
What's the difference between
#define sum 1
and const int sum = 1;
Always try to use "const int", rather than #define.
Use #define, only when your preprocessor code might be read by another tool, and it's easier for it to go with the preprocessor, rather than to parse the language.
Also it's the only way to define something to be checked later by #if/#else/#endif
No one should not!
Actually, One should prefer
const int sum = 1;
over#define sum 1
for a number of reasons:Scope Based Mechanism:
#define
s don't respect scopes so there is no way to create a class scoped namespace. While const variables can be scoped in classes.Avoiding Weird magical numbers during compilation errors:
If you are using
#define
those are replaced by the pre-processor at time of precompilation So if you receive an error during compilation, it will be confusing because the error message wont refer the macro name but the value and it will appear a sudden value, and one would waste lot of time tracking it down in code.Ease of Debugging:
Also for same reasons mentioned in #2, while debugging
#define
would provide no help really.Thus, to avoid the above situations
const
will be a better choice.In simple words
Which means, that
sum
doesn't exist after the preprocessing stage is finished.Which means
sum
exists till the executable is made out of your program.The first is a preprocessor directive, before the compiler compiles your code, it will go through and replace sum with 1. The second declares a variable in memory to hold that quantity. I'm sure it can be argued as to which is best, but the "const int" is probably more common in C++ (when it comes to numeric constants).
http://www.geekpedia.com/KB114_What-is-the-difference-between-sharpdefine-and-const.html
#define
is necessary to make things like inclusion guards work, because C++ doesn't have a real module import system.#define
causes a literal textual substitution. The preprocessor understands how to tokenize source code, but doesn't have any idea what any of it actually means. When you write#define sum 1
, the preprocessor goes over your code and looks for every instance of the tokensum
and replaces it with the token1
.This has a variety of limitations:
#define sq(x) x * x
will not work right if you use it likesq(3+3)
; and using#define
for a constant does not respect scope in any way, nor does it associate any kind of type with the constant. However,#define
can be used (especially in combination with some other special stuff like the#
and##
preprocessor operators) to do some magic that is otherwise not possible (except by manually doing what the preprocessor does).For the example that you just gave, I would normally use a const. Except of course, the #define can be used for conditional compilation elsewhere:
This is something you can't do with a const. If you don't need the value to be accessible from the preprocessor, I'd say use a const unless there's some reason why that's not possible. There's some stuff on this in the C++ FAQ lite, where they rightly point out that just because the preprocessor is "evil", it doesn't mean you'll never need it.