Reputation: 10568
I have a question about using #undef
to redefine macros.
I have a file global.h
which contains a number of #define-d macros. In the code that uses these macros, I find that the values that the macros hold are not generic enough. I want to redefine the macros to make them more generic. I wrote the following code snippet to do just that:
std::cout << endl << "Enter pitch threshold:" << endl;
std::cin >> pitchT;
#ifdef PitchThreshold
#undef PitchThreshold
#define PitchThreshold pitchT
#endif
My questions are:
Does using a #undef in this manner ensure redefinition of the macro across all source files, or is it local to the function where the above lines of code are written? What is the scope of the #undef and #define operators?
What can I do (apart from changing the macros in the file where they are #define-d itself) to ensure that the macro definitions are changed across all source files?
Thanks,
Sriram
Upvotes: 4
Views: 4461
Reputation:
any #define
macros is not local, nor global variable, but a "constant-like" expression, so, even if some DEFINED_VALUE will be #undef
ined anywhere after - this un-definition will be scoped from its place to the end of this source-file.
it has pretty straight-forward logic, but may confuse due to definitions being allowed both inside and outside of any functions.
Answering last question:
We can't really comfortably redefine a macros — in mean of global
scope. Uncomfortable way is to place all the code in a single file.
What can be done in practice is kinda default thing — new variable declaration (at the top of the main()
function) with similar naming to use it in parallel with defined value.
Upvotes: 0
Reputation: 5885
#ifdef
is a preprocessor directive, this means that it will be applied before your source code is compiled. It means that only the source code 'below' will be affected. If you run your source code through the preprocessor you'll be able to see the result. That will give you more insight in the workings of the preprocessor.
Upvotes: 10
Reputation: 17131
The scope of the #undef operator is the whole file after it's called. This includes all files that include it (because the preprocessor just chains the files together.) Because it's part of the preprocessor it doesn't have weird things like scope.
Upvotes: 2