2015-08-22 175 views
0
#include <stdio.h> 

#define N 100 

void f(void); 


int main(void) 
{ 
f(); 
#ifdef N 
#undef N 
#endif 

return 0; 
} 

void f(void){ 
#if defined(N) 
    printf("N is %d\n",N); 
#else 
    printf("N is undefined\n"); 
#endif // defined 
} 

爲什麼這個輸出打印N是不確定不應該將其打印N是100,因爲在f函數調用它達到去除值100民主基金之前?宏打印輸出

+2

預處理器不會作爲程序的流程運行。 如果您想使此布爾變量不是宏 – Alon

+1

否;預處理器按照文件中的文本順序進行文本處理,並在編譯器正確看到代碼之前執行。當編譯器看到函數'f'的主體時,宏'N'是未定義的。你可以簡單地使用'#undef N';它不會對未定義的宏取消定義,所以'#ifdef N'和匹配的'#endif'是不需要的。 –

+1

宏在運行時在編譯/編譯時解析。它們是_pre_-processed。當你的程序執行時,N不再被定義。 – ryyker

回答

1

預處理指令和宏在編譯的很早階段處理,它們在運行時不存在。

僅通過預處理器運行代碼(cpp -P - 警告:先刪除#include)顯示正在編譯的實際C代碼。

void f(void); 
int main(void) 
{ 
f(); 
return 0; 
} 
void f(void){ 
    printf("N is undefined\n"); 
} 

至於爲什麼選擇擴展而不是替代消息,請在源代碼中考慮這些行。

#ifdef N 
#undef N 
#endif 

無論最初是否定義它,它都不會在這些行(預處理)後被定義。

+0

如果你luser droog得到這個消息,謝謝我想要的東西! – jonathan

+0

@jonathan我知道的最好的教程是由原作者Kernighan http://www.quut.com/c/bwk-tutor.html。這有點舊,但仍然99%正確,並且非常短暫且易於閱讀。祝你C旅程好運! –