C语言中Macro的scope

2019-05-15  本文已影响0人  EamonXia

Question:

  How were these macros works?

# define i 20
void fun();

int main(){
  printf("%d",i);
  fun();
  printf("%d",i);
  return 0;
}

void fun(){
  #undef i
  #define i 30
}

gives outputs as 2020,however

# define i 20
void fun(){
  #undef i
  #define i 30
}

int main(){
  printf("%d",i);
  fun();
  printf("%d",i);
  return 0;
}

gives output as 3030.

Answer:

  C Preprocessor works top to bottom irrespective of function calls. It is effective from that point (line) in whatever the file that macro is defined, until corresponding undef or till end of the translation unit.

So, your code would become like this,

# define i 20
               // from now on, all token i should become 20
void fun();
int main()
{
  printf("%d",i);   // printf("%d",20);
  fun();
  printf("%d",i);   // printf("%d",20);
  return 0;
}
void fun()
{
#undef i  // from now on, forget token i
#define i 30 // from now on, all token i should become 30
}

your second code would become like this:

# define i 20  // from now on, all token i should become 20
void fun()
{
#undef i // from now on, forget i
#define i 30  // from now on, all token i should become 30
}
int main()
{
  printf("%d",i);    //  printf("%d",30);
  fun();
  printf("%d",i);    // printf("%d",30);
  return 0;
}

so the outputs is 3030
  In addition,Note that despite other answers asserting that there is no scope, C preprocessor macros do have a well-defined scope, but that scope is only relevant to the preprocessing phase, not any other phase of translation.That scope is "From point of definition until the end of the current translation unit, or until the macro is undefined using #undefine or redefined using#define
  On the other hand,we can use gcc -E -o hello.pp.c hello.cto stop after pre-processing,In this way we can watch the “source file” hello.pp.c which is the outputs of the preprocessor.
[C Primer Plus 6th edtion P760]

Reference:

Frome Source code to executable
C preprocessor - Scope of macros in C?

上一篇 下一篇

猜你喜欢

热点阅读