I'm reading C Programming: A Modern Approach. In Ch14 exercise #11:
#include <stdio.h>
#define N 100
void f(void);
int main(void) {
f();
#ifdef N
#undef N
#endif
return 0;
}
void f(void) {
#if defined(N)
printf("N is %d\n", N);
#else
printf("N is undefined\n");
#endif
}
The output is N is undefined
, while I expected it to be N is 100
. However, if we move the content of function f
into main
, it works as expected:
#include <stdio.h>
#define N 100
void f(void);
int main(void) {
#if defined(N)
printf("N is %d\n", N);
#else
printf("N is undefined\n");
#endif
#ifdef N
#undef N
#endif
return 0;
}
The output is N is 100
. Why so? Why the preprocessor can retroactively apply the #undef
into f()
? Thanks.
CodePudding user response:
Macro preprocessing takes place before other steps of compilation, let alone runtime evaluation. It's line-by-line, you can think of it as a text replacement. So, when you write #undef N
in main()
, then you already undefine the macro; it'll not be defined in f()
.
Of course, if you check it before undefining it (but after defining it as 100
), then it'll have the value you'd expect.