2014-07-10 66 views
-2
#include<stdio.h> 

int main() 
{ 
printf("%d",a); 
#define a 10 
} 

/*预处理活动做了compliation发生之前,为什么错误在这个节目来了,“一”是不确定的是 一个没有定义*/定义指令

/*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 

/*现在,这里还错误应该作为一个没有定义的,因为#定义之前乐趣的调用,但它的工作原理完全正确的*/

/*任何帮助将大大承认事先

*/ 感谢

回答

-1

你所说的那样:

预处理活动在compliation做过发生

所以应该

#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 10int a = 10;

5

documentation on MSDN

预处理指令可以在源文件的任何地方出现,但它们只适用于源文件的剩余部分。

在你的第一个例子,a在使用之前你#define它,而在第二,你叫fun第一,但后来在源定义它,你已经使用#define后。我相信这就是为什么第一个有错误,但第二个错误没有。

+0

非常感谢您的先生。 – user3679728

2

在编译时间之前,预处理器执行使用#define s执行搜索并替换。因此,使用#define宏是而不是就像声明变量一样。

当预处理器(与编译器分开)经过您的代码时,首先会看到#define语句。它解释为“每当我看到a,我会用20替换它。”然后,在多行后,它会看到a并将其替换。在此之后,编译运行,并且它看到和下面的语句:

printf("i m inside the function %d",20); 

20在这种情况下,使用一个完全有效的事情,所以相应的编译。

您的困惑是由于函数调用的顺序。然而,预处理器并不在乎什么叫什么。它所关心的是事件出现在源文件中的顺序。

0

移动中的#define在你的功能的打印语句之后,然后你就会明白为什么这并没有给你一个错误(为什么你现在有一个错误)。只有在文件的其余部分发生时才会处理#define。这就是为什么你通常想把它们放在文件的顶部。