2014-07-10 64 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。這就是爲什麼你通常想把它們放在文件的頂部。