Sriram
Sriram

Reputation: 10568

scope of #undef C++


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

Answers (3)

user12559754
user12559754

Reputation:

any #define macros is not local, nor global variable, but a "constant-like" expression, so, even if some DEFINED_VALUE will be #undefined 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

Sebastiaan M
Sebastiaan M

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

OmnipotentEntity
OmnipotentEntity

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

Related Questions