#include<stdio.h>
int main()
{
printf("%d",a);
#define a 10
}
/ *预处理程序活动是在完成编译之前完成的,所以为什么错误来自这个程序,'a'是未定义的,即 a未定义* /
/*second doubt*/
#include<stdio.h>
#include<stdlib.h>
void fun();
int main()
{
fun();
#define a 20
}
void fun()
{
printf("i m inside the function %d",a);
}
output->i m inside the function 20
/ *现在这里也会出现错误,因为没有定义,因为在#define之前调用了fun,但它的工作正常* /
/ *任何帮助都将得到极大的认可* / 提前谢谢
答案 0 :(得分:5)
预处理程序指令可以出现在源文件中的任何位置,但它们仅适用于源文件的其余部分。
在您的第一个示例中,a
在#define
之前使用,而在第二个示例中,您首先调用fun
,但在使用{之后在源中定义它{ {1}}。我相信这就是为什么第一个有错误,但第二个没有错误。
答案 1 :(得分:2)
预处理器执行使用#define
来在编译时之前搜索并替换。因此,使用#define
宏不就像声明变量一样。
当预处理器(与编译器分开)通过您的代码时,首先它会看到#define
语句。它将此解释为“每当我看到a
时,我都会用20
替换它。”然后,在多几行之后,它会看到a
并替换它。在此之后,编译器运行,它会看到以下语句:
printf("i m inside the function %d",20);
在这种情况下,20是完全有效的东西,因此它会相应地编译它。
您的混淆是由于函数被调用的顺序。然而,预处理器不关心什么调用什么。它所关心的只是事物在源文件中出现的顺序。
答案 2 :(得分:0)
将#define移动到函数中的print语句之后,然后你就会明白为什么这不会给你一个错误(以及为什么你现在有错误)。 #defines仅在文件的其余部分发生时进行处理。这就是您通常希望将它们放在文件顶部的原因。
答案 3 :(得分:-1)
就像你说的那样:
预处理器活动在完成补充之前完成
所以它应该是
#include<stdio.h>
#define a 10
int main()
{
printf("%d",a);
}
或
#include<stdio.h>
#include<stdlib.h>
#define a 20
void fun();
int main()
{
fun();
}
void fun()
{
printf("i m inside the function %d",a);
}
如果要在功能块中使用它,请将 #define a 10 更改为 int a = 10;