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?
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.
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