Reputation: 81
I define a macro twice as follows:
#define a 2
#define a 3
I thought any occurrence of a
in the code would be replaced by 2
, and when #define a 3
is encountered there are no more a
s are available in the code to be replaced by 3
, so the 2
would take precedence.
But when I executed it a
was replaced by 3, why?
Upvotes: 6
Views: 9597
Reputation: 241861
If you define a macro twice like that, the compiler should at least give you warning, if not an error. It is an error.
§6.10.3/2 : An identifier currently defined as an object-like macro shall not be redefined by another
#define
preprocessing directive unless the second definition is an object-like macro definition and the two replacement lists are identical.
You can redefine a macro by explicitly removing the previous definition:
#define a 2
/* In this part of the code, a will be replaced with 2 */
...
#undef a
#define a 3
/* From here on, a will be replaced with 3 */
...
Macro replacement happens as the file is read, using the macro definitions active at that point in the file, except inside (most) preprocessing directives.
§6.10/7: The preprocessing tokens within a preprocessing directive are not subject to macro expansion unless otherwise stated.
§6.10.3.5/1: A macro definition lasts (independent of block structure) until a corresponding
#undef
directive is encountered or (if none is encountered) until the end of the preprocessing translation unit.
Upvotes: 12
Reputation: 7941
a
will not be replaced by 2 in #define a 3
as this is also a pre processor.
After processing #define a 2
, the value of a
is 2, but it is overwritten by the next statement #define a 3
Upvotes: 7
Reputation: 206667
It's not clear to me what you were expecting to see.
The second line overrides the definition of a
from the first line.
Any a
encountered after that will be replaced by 3
.
Upvotes: 5