If I have a #define statement within a namespace as such:
namespace MyNamespace
{
#define SOME_VALUE 0xDEADBABE
}
Am I correct in saying that the #define statement is not restricted to the namespace?
Is the following the "correct" thing to do?
namespace MyNamespace
{
const unsigned int SOME_VALUE = 0xDEADBABE;
}
Correct,#define
's aren't bound by namespaces. #define
is a preprocessor directive - it results in manipulation of the source file prior to being compiled via the compiler. Namespaces are used during the compilation step and the compiler has no insight into the #define
's.
You should try to avoid the preprocessor as much as possible. For constant values like this, prefer const over #define
's.
I completely agree with the suggestions on the use of constants and the scope being unlimited for #define
s.
However, if you do have to use preprocessor #define
lines, please cover them up correctly for the expected scope,
namespace MyNamespace
{
#define SOME_VALUE 0xDEADBABE
// your code
#undef SOME_VALUE
}
Why #defines
?
I know one case where an embedded platform did not support constants in the code.
There was no way to initialize them...
It always helps to be more readable.
The preprocessor operates (conceptually at least, and often actually too) before namespaces and other language-level concepts "kick in" -- so yes, it's definitely much better to use language-level constructs such as const
values wherever you can!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With