For example, I saw source code like the following. Can we use #define
in a function? How does it work? (more information: this code is what I copied from
You can use it inside a function, but it is not scoped to the function. So, in your example, the second definitions of a macro will be a redefinition and generate an error. You need to use #undef
to clear them first.
How does it work? All C/C++ files are first processed by... the preprocessor.
It doesn't know anything about C nor C++ syntax. It simply replaces THIS_THING
with ANOTHER THING
. That's why you can place a #define
in functions as well.
#define
is a preprocessor directive: it is used to generate the eventual C++ code before it is handled to the compiler that will generate an executable. Therefore code like:
for(int i = 0; i < 54; i++) {
#define BUFFER_SIZE 1024
}
is not executed 54 times (at the preprocessor level): the preprocessor simply runs over the for
loop (not knowing what a for
loop is), sees a define statement, associates 1024
with BUFFER_SIZE
and continues. Until it reaches the bottom of the file.
You can write #define
everywhere since the preprocessor is not really aware of the program itself.
Sure this is possible. The #define
is processed by the preprocessor before the compiler does anything. It is a simple text replacement. The preprocessor doesn't even know if the line of code is inside or outside a function, class or whatever.
By the way, it is generally considered bad style to define preprocessor macros in C++. Most of the things they are used for can be better achieved with templates.
Sure. #define
is handled by the preprocessor which occurs well before the compiler has any sense of lines of code being inside functions, inside parameters lists, inside data structures, etc.
Since the preprocessor has no concept of C++ functions, it also means that there is no natural scope to macro definitions. So if you want to reuse a macro name, you have to #undef NAME
to avoid warnings.
You can use #define
anywhere you want. It has no knowledge of functions and is not bound by their scope. As the preprocessor scans the file from top-to-bottom it processes #define
s as it sees them. Do not be misled (by silly code like this!) into thinking that the #define
is somehow processed only when the function is called; it's not.