当函数调用预处理程序指令时,输出会有所不同。为什么?

时间:2017-08-07 06:10:06

标签: c c-preprocessor

这个问题在接受采访时被问到,我完全不知道输出的差异。以下是问题

#define a 10
void foo();
int main()
{
   printf("%d..",a);
   foo();
   printf("%d",a);
}
void foo()
{
   #undef a
   #define a 50
}

这给了我10..10作为输出,而。,

#define a 10
void foo()
{
   #undef a
   #define a 50
}
int main()
{
   printf("%d..",a);
   foo();
   printf("%d",a);
}

这给了我50..50作为输出。 请解释。谢谢

2 个答案:

答案 0 :(得分:2)

这是因为预处理替换甚至在实际编译之前发生,它不会在运行时发生。

#define指令的值(或定义)根据编写的代码语法有效,而不是根据调用约定。

所以,在第一种情况下

#define a 10                 // a is defined here
void foo();
int main()
{
   printf("%d..",a);         // a == 10, substitution happens
   foo();                    //nothing useful here
   printf("%d",a);           // a == 10, substitution happens
}
void foo()
{
   #undef a                 // a vanished
   #define a 50             // a is redefined as 50
}                           // a will be substituted to 50 hereon, is used

然而,在第二种情况下

#define a 10               // a is defined here
void foo()
{
   #undef a                // a vanished
   #define a 50            // a is redefined as 50
}                          // a will be substituted to 50 hereon, is used
int main()
{
   printf("%d..",a);      // a == 50, substitution happens
   foo();                  // nothing useful here
   printf("%d",a);        // a == 50, substitution happens
}

答案 1 :(得分:1)

在按照预处理程序指令在文件中出现的顺序编译代码之前运行预处理程序,而不是按文件中定义的函数顺序运行。