2015-08-22 173 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旅程好运! –